Respuestas:
Utilizar rand(range)
De Ruby Random Numbers :
Si se necesitaba un número entero aleatorio para simular una tirada de un dado de seis caras, que tendría que utilizar:
1 + rand(6)
. Se podría simular un rollo de dados2 + rand(6) + rand(6)
.Finalmente, si solo necesita un flotante aleatorio, simplemente llame
rand
sin argumentos.
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:
10.times.map{ 20 + Random.rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Nota:
Usar Random.new.rand(20..30)
(usar Random.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 un max
valor, no un Range
, 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 un Range
, 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ía 20 + Random.rand(11)
, ya que Random.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.
Random
clase, pero es una idea terrible llamar Random.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 entre 10
y 42
(donde 10 es inclusivo y 42 exclusivo), hay una mejor manera desde Ruby 1.9.3, donde puede llamar:
rand(10...42) # => 13
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:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
La Random
clase en 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 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 vez MyApp::Random = Random.new
y usarlo en cualquier otro lugar.
Los casos en los que Random.new
es útil son los siguientes:
rand
/ en la Random.rand
que los principales programas podrían estar confiandoRandom
objetos se pueden ordenar)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. El Random.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 desde ActiveSupport
el núcleo de rubí 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)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
no toma un rango, así que no. Probablemente desee algo como SecureRandom.random_number(10_000)
(para 0-9999) o SecureRandom.random_number(9_000)+1_000
(para 1000-9999).
Puede generar un número aleatorio con el rand
método El argumento pasado al rand
método debe ser un integer
o a 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
rand(1..6)
lecturas es más claro que las respuestas principales rand(6)+1
.
Bueno, lo descubrí. Aparentemente hay una función incorporada (?) Llamada rand:
rand(n + 1)
Si alguien responde con una respuesta más detallada, lo marcaré como la respuesta correcta.
La respuesta más simple a la pregunta:
rand(0..n)
Puedes simplemente usar random_number
.
Si un entero positivo se da como n, random_number
devuelve un entero: 0 <= random_number
<n.
Úselo así:
any_number = SecureRandom.random_number(100)
La salida será cualquier número entre 0 y 100.
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 las versiones más nuevas (1.9+ creo) de ruby.
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)
range.to_a.sample
Es una idea horrible cuando la muestra es grande.
puedes hacer rand (rango)
x = rand(1..5)
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
puts (rand() * 10).to_i
Genere un número del 0 al 10 de una manera más legible
puts rand(10)
Genere un número del 10 al 15, incluido 15
puts rand(10..15)
Números aleatorios no aleatorios
Genere la misma secuencia de números cada vez que se ejecuta el programa
srand(5)
Genera 10 números aleatorios
puts (0..10).map{rand(0..10)}
Quizás te ayude. Lo uso 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)
Pruebe el array#shuffle
método de aleatorización
array = (1..10).to_a
array.shuffle.first
.shuffle.first
con .sample
!
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-srand