¿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 con2 + 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:
rand
/ Random.rand
. Random.rand
que los progtwigs principales podrían estar confiando en 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, Úselo así: La salida será cualquier número entre 0 y 100. random_number
devuelve un número entero: 0 <= random_number
any_number = SecureRandom.random_number(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
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.