Pregunta Cómo obtener un número al azar en Ruby


¿Cómo genero un número aleatorio entre 0 y n?


701
2017-10-13 18:07


origen


Respuestas:


Utilizar rand(range)

De Ruby Random Numbers:

Si necesitaras un entero aleatorio para simular una tirada de un dado de seis caras, usarías: 1 + rand(6). Un rollo en craps podría ser simulado con 2 + rand(6) + rand(6).

Finalmente, si solo necesitas un flotador aleatorio, simplemente llama rand sin argumentos


Como Marc-André Lafortune menciona en su respuesta a continuación (ir arriba), Ruby 1.9.2 tiene su propio Random clase (que el propio Marc-André ayudó a depurar, por lo tanto, la 1.9.2 objetivo para esa característica).

Por ejemplo, en este juego donde necesitas adivinar 10 números, puedes inicializarlos con:

10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

Nota:

Es por eso que el equivalente de Random.new.rand(20..30) sería 20 + Random.rand(11), ya que Random.rand(int) devuelve "un entero aleatorio mayor o igual a cero y menos que el argumento" 20..30 incluye 30, necesito encontrar un número aleatorio entre 0 y 11, excluyendo 11.


878
2017-10-13 18:10



Si bien puedes usar rand(42-10) + 10 para obtener un número aleatorio entre 10 y 42 (donde 10 es inclusivo y 42 exclusivo), hay una forma mejor desde Ruby 1.9.3, donde puede llamar:

rand(10...42) # => 13

Disponible para todas las versiones de Ruby requiriendo mi backports joya.

Ruby 1.9.2 también introdujo el Random clase para que pueda crear sus propios objetos generadores de números aleatorios y tenga una buena API:

r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"

los Random la clase en sí actúa como un generador aleatorio, por lo que llama directamente:

Random.rand(10...42) # => same as rand(10...42)

Notas sobre Random.new

En la mayoría de los casos, lo más simple es usar rand o Random.rand. Crear un nuevo generador aleatorio cada vez que desee un número aleatorio es muy mala idea. Si haces esto, obtendrás las propiedades aleatorias del algoritmo inicial de siembra que son atroces en comparación con las propiedades del generador aleatorio en sí.

Si utiliza Random.new, deberías por lo tanto llamarlo tan raramente como sea posible, por ejemplo una vez como MyApp::Random = Random.new y usarlo en todos lados.

Los casos donde Random.new es útil son los siguientes:

  • estás escribiendo una gema y no quieres interferir con la secuencia de rand/Random.rand que los programas principales podrían estar confiando en
  • quieres secuencias reproducibles separadas de números aleatorios (digamos uno por hilo)
  • desea poder guardar y reanudar una secuencia reproducible de números aleatorios (tan fácil como Randomlos objetos pueden organizarse)

570
2018-05-05 14:01



Si no solo buscas un número sino también un hexágono o un gráfico, vale la pena mencionar que el SecureRandom módulo encontró su camino desde ActiveSupport al núcleo Ruby en 1.9.2+. Entonces, sin la necesidad de un marco completo:

require 'securerandom'

p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88

p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409

p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"

Está documentado aquí: Ruby 1.9.3 - Módulo: SecureRandom (lib / securerandom.rb)


43
2017-07-20 11:15



Puede generar un número aleatorio con el rand método. El argumento pasó a la rand método debe ser un integer o una rangey devuelve un número aleatorio correspondiente dentro del rango:

rand(9)       # this generates a number between 0 to 8
rand(0 .. 9)  # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range

32
2017-12-12 20:12



Bueno, lo descubrí. Aparentemente hay una función integrada (?) Llamada rand:

rand(n + 1)

Si alguien responde con una respuesta más detallada, lo marcaré como la respuesta correcta.


20
2017-10-13 18:10



¿Qué hay de esto?

n = 3
(0..n).to_a.sample

18
2018-05-23 06:02



Respuesta más simple a la pregunta:

rand(0..n)

11
2018-02-19 18:53



rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

Tenga en cuenta que la opción de rango solo está disponible en versiones más nuevas (1.9+ creo) de ruby.


6
2017-11-15 23:31