¡Gracias! Creo que me quedaré con el viejo y el buen método :)
Misha Moroshko
32
Esta es una muy mala idea, especialmente si su ayb son de tamaños desconocidos. Pruebe (100000000000000000..100000000000000) .to_a.sample y vea lo que quiero decir
:)
44
@pixelearth, si tiene una mejor idea, lo que concuerda con la pregunta, puede publicar.
Nakilon
rand(a..b)no funciona, se divide: TypeError: can't convert Range into Integer. Ni siquiera es compatible con Ruby 2.0
fguillen
2
@fguillen Me funciona en 1.9.3, no sé por qué no te funciona.
Michael Dorst
87
Random.new.rand(a..b)
¿Dónde aestá su valor más bajo y bsu valor más alto?
La diferencia importante a tener en cuenta es que si solo llama rand(), está llamando Kernel#rand, lo que solo admite un maxargumento. Si desea pasar un rango, debe usarlo Random#rand, lo que significa que debe implementarlo de esta manera. +1
Vea esta respuesta: hay en Ruby 1.9.2, pero no en versiones anteriores. Personalmente, creo que rand (8) + 3 está bien, pero si está interesado, consulte la clase Aleatoria descrita en el enlace.
Y aquí hay un punto de referencia rápido para ambos #sampley #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.8700000.0200003.890000(3.888147)
rand 0.1500000.0000000.150000(0.153557)
def my_rand(x, y); rand(y - x) + x; end
y - x + 1
por cierto.rand(3..10)
Respuestas:
ACTUALIZACIÓN: Ruby 1.9.3
Kernel#rand
también acepta rangoshttp://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.
O
Array # 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.
fuente
rand(a..b)
no funciona, se divide:TypeError: can't convert Range into Integer
. Ni siquiera es compatible con Ruby 2.0¿Dónde
a
está su valor más bajo yb
su valor más alto?fuente
rand()
, está llamandoKernel#rand
, lo que solo admite unmax
argumento. Si desea pasar un rango, debe usarloRandom#rand
, lo que significa que debe implementarlo de esta manera. +1Kernel # rand
fuente
Solo tenga en cuenta la diferencia entre los operadores de rango:
fuente
Vea esta respuesta: hay en Ruby 1.9.2, pero no en versiones anteriores. Personalmente, creo que rand (8) + 3 está bien, pero si está interesado, consulte la clase Aleatoria descrita en el enlace.
fuente
Para 10 y 10 ** 24
fuente
rand(10..10**24)
fuente
Y aquí hay un punto de referencia rápido para ambos
#sample
y#rand
:Entonces, hacer
rand(a..b)
es lo correctofuente