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

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

Use 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) . Una tirada en craps podría simularse con 2 + rand(6) + rand(6) .

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


Como menciona Marc-André Lafortune en su respuesta a continuación (vuélgalo arriba) , Ruby 1.9.2 tiene su propia clase Random (que el propio Marc-André ayudó a depurar , de ahí el objective 1.9.2 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:

  • Usar Random.new.rand(20..30) (usando Random.new ) en general no sería una buena idea, como explica en detalle (una vez más) Marc-André Lafortune en su respuesta (nuevamente).

  • Pero si no usa Random.new , entonces el rand método de clase solo toma un valor max , no un Range , como señala barandilla (energéticamente) en el comentario (y como se documenta en los documentos para Random ). Solo el método de instancia puede tomar un Range , como se ilustra generando un número aleatorio con 7 dígitos .

Esta es la razón por la cual 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 menor que el argumento . ” 20..30 30 incluye 30, necesito encontrar un número aleatorio entre 0 y 11, excluyendo 11.

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 puedes llamar:

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

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

Ruby 1.9.2 también introdujo la clase Random 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" 

La clase Random sí misma 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 una 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í mismo .

Si usa Random.new , debería llamarlo con la Random.new posible , por ejemplo una vez como MyApp::Random = Random.new y usarlo en cualquier otro lugar.

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

  • estás escribiendo una joya y no quieres interferir con la secuencia rand / Random.rand . Random.rand que los progtwigs 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 los objetos Random pueden organizarse)

Si no solo está buscando un número sino también un hexágono o un gráfico, vale la pena mencionar que el módulo SecureRandom encontró su camino desde ActiveSupport hasta el 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)

Puede generar un número aleatorio con el método rand . El argumento pasado al método rand debe ser un integer o un range , y 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 

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.

¿Qué hay de esto?

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

Respuesta más simple a la pregunta:

 rand(0..n) 
 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.

Simplemente puede usar random_number .

Si un entero positivo se da como n, random_number devuelve un número entero: 0 <= random_number

Úselo así:

 any_number = SecureRandom.random_number(100) 

La salida será cualquier número entre 0 y 100.

Este enlace será útil con respecto a esto;

http://ruby-doc.org/core-1.9.3/Random.html

Y algo más de claridad a continuación sobre los números aleatorios en ruby;

Genera un entero de 0 a 10

 puts (rand() * 10).to_i 

Genera un número de 0 a 10 de una manera más legible

 puts rand(10) 

Genera un número del 10 al 15, incluyendo 15

 puts rand(10..15) 

Números aleatorios no aleatorios

Genere la misma secuencia de números cada vez que se ejecuta el progtwig

 srand(5) 

Genera 10 números aleatorios

 puts (0..10).map{rand(0..10)} 

rango = 10..50

rand (rango)

o

range.to_a.sample

o

range.to_a.shuffle (esto mezclará toda la matriz y puede elegir un número aleatorio por primera o última o cualquiera de esta matriz para elegir una aleatoria)

puedes hacer rand (rango)

 x = rand(1..5) 

Pruebe array#shuffle método array#shuffle para la aleatorización

 array = (1..10).to_a array.shuffle.first 

Tal vez te ayude. Yo uso esto en mi aplicación

 https://github.com/rubyworks/facets class String # Create a random String of given length, using given character set # # Character set is an Array which can contain Ranges, Arrays, Characters # # Examples # # String.random # => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3" # # String.random(10) # => "t8BIna341S" # # String.random(10, ['a'..'z']) # => "nstpvixfri" # # String.random(10, ['0'..'9'] ) # => "0982541042" # # String.random(10, ['0'..'9','A'..'F'] ) # => "3EBF48AD3D" # # BASE64_CHAR_SET = ["A".."Z", "a".."z", "0".."9", '_', '-'] # String.random(10, BASE64_CHAR_SET) # => "xM_1t3qcNn" # # SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"] # BASE91_CHAR_SET = ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS] # String.random(10, BASE91_CHAR_SET) # => "S(Z]z,J{v;" # # CREDIT: Tilo Sloboda # # SEE: https://gist.github.com/tilo/3ee8d94871d30416feba # # TODO: Move to random.rb in standard library? def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"]) chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten Array.new(len){ chars.sample }.join end end 

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

Funciona bien para mí

¿Que tal este?

 num = Random.new num.rand(1..n) 

La forma más fácil de obtener un número aleatorio en ruby ​​es

 def random (1..10).to_a.sample.to_s end 

No olvides sembrar el RNG con srand () primero.