¿Cómo genero un número aleatorio entre 0
y n
?
ruby-on-rails
ruby
ruby-on-rails-3
ruby-on-rails-4
random
Mark A. Nicolosi
fuente
fuente
srand <some_number>
antes de escribir elrand
código le dará una secuencia pseudoaleatoria determinista (es decir, repetible), si la necesita. ruby-doc.org/core-2.5.6/Random.html#method-c-srandRespuestas:
Utilizar
rand(range)
De Ruby Random Numbers :
Como Marc-André Lafortune menciona en su respuesta a continuación (ir a votar) , Ruby 1.9.2 tiene su propia
Random
clase (que el propio Marc-André ayudó a depurar , de ahí el objetivo 1.9.2 para esa característica).Por ejemplo, en este juego donde necesitas adivinar 10 números , puedes inicializarlos con:
Nota:
Usar
Random.new.rand(20..30)
(usarRandom.new
) generalmente no sería una buena idea, como se explica en detalle (nuevamente) por Marc-André Lafortune , en su respuesta (nuevamente).Pero si no lo usa
Random.new
, entonces el método de claserand
solo toma unmax
valor, no unRange
, como señala la barandilla (enérgicamente) en el comentario (y como se documenta en los documentos paraRandom
). Solo el método de instancia puede tomar unRange
, como se ilustra al generar un número aleatorio con 7 dígitos .Es por eso que el equivalente de
Random.new.rand(20..30)
sería20 + Random.rand(11)
, ya queRandom.rand(int)
devuelve "un entero aleatorio mayor o igual que cero y menor que el argumento ".20..30
incluye 30, necesito encontrar un número aleatorio entre 0 y 11, excluyendo 11.fuente
Random
clase, pero es una idea terrible llamarRandom.new
varias veces como en su ejemplo. He editado mi respuesta para decir eso.Random.rand
no aceptar un rango, en realidad. (Desde 1.9.3, creo.)Si bien puede usar
rand(42-10) + 10
para obtener un número aleatorio entre10
y42
(donde 10 es inclusivo y 42 exclusivo), hay una mejor manera desde Ruby 1.9.3, donde puede llamar:Disponible para todas las versiones de Ruby al requerir mi
backports
gema.Ruby 1.9.2 también introdujo la
Random
clase para que pueda crear sus propios objetos generadores de números aleatorios y tiene una buena API:La
Random
clase en sí misma actúa como un generador aleatorio, por lo que llama directamente:Notas sobre
Random.new
En la mayoría de los casos, lo más simple es usar
rand
oRandom.rand
. Crear un nuevo generador aleatorio cada vez que desee un número aleatorio es una muy mala idea . Si hace esto, obtendrá las propiedades aleatorias del algoritmo de inicialización inicial que son atroces en comparación con las propiedades del generador aleatorio en sí .Si lo usa
Random.new
, debería llamarlo tan raramente como sea posible , por ejemplo una vezMyApp::Random = Random.new
y usarlo en cualquier otro lugar.Los casos en los que
Random.new
es útil son los siguientes:rand
/ en laRandom.rand
que los principales programas podrían estar confiandoRandom
objetos se pueden ordenar)fuente
backports
gem es simplemente una colección de métodos que son nuevos para RUby 1.8.7, 1.9.1, 1.9.2, pero implementados en Ruby. Uso RubySpec para asegurar que los resultados sean compatibles con Ruby.Random.rand(10..42)
No funciona. ElRandom.rand
método de clase no acepta un rango. (Ruby 1.9.2p180)Si no solo está buscando un número, sino también hexadecimal u uid, vale la pena mencionar que el
SecureRandom
módulo encontró su camino desdeActiveSupport
el núcleo de rubí en 1.9.2+. Entonces, sin la necesidad de un marco completo:Está documentado aquí: Ruby 1.9.3 - Módulo: SecureRandom (lib / securerandom.rb)
fuente
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
no toma un rango, así que no. Probablemente desee algo comoSecureRandom.random_number(10_000)
(para 0-9999) oSecureRandom.random_number(9_000)+1_000
(para 1000-9999).Puede generar un número aleatorio con el
rand
método El argumento pasado alrand
método debe ser uninteger
o arange
, y devuelve un número aleatorio correspondiente dentro del rango:fuente
rand(1..6)
lecturas es más claro que las respuestas principalesrand(6)+1
.Bueno, lo descubrí. Aparentemente hay una función incorporada (?) Llamada rand:
Si alguien responde con una respuesta más detallada, lo marcaré como la respuesta correcta.
fuente
¿Qué hay de esto?
fuente
rand
es O (1).La respuesta más simple a la pregunta:
fuente
Puedes simplemente usar
random_number
.Si un entero positivo se da como n,
random_number
devuelve un entero: 0 <=random_number
<n.Úselo así:
La salida será cualquier número entre 0 y 100.
fuente
Tenga en cuenta que la opción de rango solo está disponible en las versiones más nuevas (1.9+ creo) de ruby.
fuente
ruby 1.9.3+
. No funcionó1.9.2
cuando lo intenté al menos.rango = 10..50
rand (rango)
o
rango.a_una.muestra
o
range.to_a.shuffle (esto barajará toda la matriz y puede elegir un número aleatorio por primera o última o cualquiera de esta matriz para elegir uno aleatorio)
fuente
range.to_a.sample
Es una idea horrible cuando la muestra es grande.puedes hacer rand (rango)
fuente
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 rubí;
Genera un entero de 0 a 10
Genere un número del 0 al 10 de una manera más legible
Genere un número del 10 al 15, incluido 15
Números aleatorios no aleatorios
Genere la misma secuencia de números cada vez que se ejecuta el programa
Genera 10 números aleatorios
fuente
La forma fácil de obtener un número aleatorio en rubí es,
fuente
Quizás te ayude. Lo uso en mi aplicación
https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb
Funciona bien para mí
fuente
¿Que tal este?
fuente
Pruebe el
array#shuffle
método de aleatorizaciónfuente
.shuffle.first
con.sample
!No olvide sembrar el RNG con srand () primero.
fuente