Para generar un número aleatorio entre 3 y 10, por ejemplo, uso: rand(8) + 3
¿Hay una mejor manera de hacer esto (algo así como rand(3, 10)
)?
y - x + 1
por cierto.
rand(3..10)
Para generar un número aleatorio entre 3 y 10, por ejemplo, uso: rand(8) + 3
¿Hay una mejor manera de hacer esto (algo así como rand(3, 10)
)?
y - x + 1
por cierto.
rand(3..10)
Respuestas:
ACTUALIZACIÓN: Ruby 1.9.3 Kernel#rand
también acepta rangos
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
La conversión a matriz puede ser demasiado costosa y no es necesaria.
(a..b).to_a.sample
O
[*a..b].sample
Estándar en Ruby 1.8.7+.
Nota: fue nombrado #choice en 1.8.7 y renombrado en versiones posteriores.
Pero de todos modos, la generación de matriz necesita recursos, y la solución que ya escribió es lo mejor que puede hacer.
Random.new.rand(a..b)
¿Dónde a
está su valor más bajo y b
su valor más alto?
rand()
, está llamando Kernel#rand
, lo que solo admite un max
argumento. Si desea pasar un rango, debe usarlo Random#rand
, lo que significa que debe implementarlo de esta manera. +1
rand(3..10)
Cuando max es un Range, rand devuelve un número aleatorio donde range.member? (Number) == true.
Solo tenga en cuenta la diferencia entre los operadores de rango:
3..10 # includes 10
3...10 # doesn't include 10
Y aquí hay un punto de referencia rápido para ambos #sample
y #rand
:
irb(main):014:0* Benchmark.bm do |x|
irb(main):015:1* x.report('sample') { 1_000_000.times { (1..100).to_a.sample } }
irb(main):016:1> x.report('rand') { 1_000_000.times { rand(1..100) } }
irb(main):017:1> end
user system total real
sample 3.870000 0.020000 3.890000 ( 3.888147)
rand 0.150000 0.000000 0.150000 ( 0.153557)
Entonces, hacer rand(a..b)
es lo correcto
def my_rand(x, y); rand(y - x) + x; end