Comment générer un nombre aléatoire entre a et b en Ruby?
Pour générer un nombre aléatoire entre 3 et 10, par exemple, j'utilise: rand(8) + 3
y a-t-il une meilleure façon de faire cela (quelque chose comme rand(3, 10)
)?
8 réponses
mise à jour: Ruby 1.9.3 Kernel#rand
accepte aussi les gammes
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
convertir en tableau peut être trop cher, et il est inutile.
(a..b).to_a.sample
ou
[*a..b].sample
Standard en Ruby 1.8.7+.
Note: a été nommé #choice en 1.8.7 et renommé dans les versions suivantes.
mais de toute façon, la génération de tableau besoin de ressources, et la solution que vous avez déjà écrit est le meilleur, vous pouvez faire.
Random.new.rand(a..b)
où a
est votre valeur la plus basse et b
est votre valeur la plus élevée.
rand(3..10)
quand max est un rang, rand renvoie un nombre aléatoire où rang.membre?(nombre) = = vrai.
il suffit de noter la différence entre les opérateurs de gamme:
3..10 # includes 10
3...10 # doesn't include 10
Et voici un benchmark rapide pour les deux #sample
et #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)
donc, faire rand(a..b)
est la bonne chose