Per generare un numero casuale compreso tra 3 e 10, ad esempio, utilizzo: rand(8) + 3
C'è un modo migliore per farlo (qualcosa del genere rand(3, 10)
)?
y - x + 1
a proposito.
rand(3..10)
Per generare un numero casuale compreso tra 3 e 10, ad esempio, utilizzo: rand(8) + 3
C'è un modo migliore per farlo (qualcosa del genere rand(3, 10)
)?
y - x + 1
a proposito.
rand(3..10)
Risposte:
AGGIORNAMENTO: Ruby 1.9.3 Kernel#rand
accetta anche intervalli
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
La conversione in array può essere troppo costosa ed è inutile.
(a..b).to_a.sample
O
[*a..b].sample
Standard in Ruby 1.8.7+.
Nota: è stato nominato #Choice in 1.8.7 e ribattezzato nelle versioni successive.
Ma comunque, generare array ha bisogno di risorse e la soluzione che hai già scritto è la migliore che puoi fare.
rand(a..b)
non funziona, si divide: TypeError: can't convert Range into Integer
. Non è nemmeno supportato in Ruby 2.0
Random.new.rand(a..b)
Dov'è a
il valore più basso ed b
è il valore più alto.
rand()
stai chiamando Kernel#rand
, il che supporta solo un max
argomento. Se vuoi superare un intervallo, devi usare Random#rand
, nel senso che devi implementare in questo modo. +1
rand(3..10)
Quando max è un intervallo, rand restituisce un numero casuale in cui range.member? (Numero) == vero.
Basta notare la differenza tra gli operatori della gamma:
3..10 # includes 10
3...10 # doesn't include 10
Ed ecco un rapido benchmark per entrambi #sample
e #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)
Quindi, fare rand(a..b)
è la cosa giusta
def my_rand(x, y); rand(y - x) + x; end