Comment générer un nombre aléatoire entre a et b dans 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 le faire (quelque chose comme rand(3, 10) )?

MISE À JOUR: Ruby 1.9.3 Kernel#rand accepte également les plages

 rand(a..b) 

http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html

La conversion en tableau peut être trop coûteuse et inutile.


 (a..b).to_a.sample 

Ou

 [*a..b].sample 

Array # sample

Standard en Ruby 1.8.7+.
Remarque: a été nommé #choice en 1.8.7 et renommé dans les versions ultérieures.

Mais de toute façon, la génération de tableau nécessite des ressources, et la solution que vous avez déjà écrite est la meilleure que vous puissiez faire.

 Random.new.rand(a..b) 

a est votre valeur la plus basse et b est votre valeur la plus élevée.

 rand(3..10) 

Noyau # rand

Lorsque max est un Range, rand renvoie un nombre aléatoire où range.member? (Nombre) == true.

Notez simplement la différence entre les opérateurs de la gamme:

 3..10 # includes 10 3...10 # doesn't include 10 

Voir cette réponse: il existe dans Ruby 1.9.2, mais pas dans les versions antérieures. Personnellement, je pense que rand (8) + 3 va bien, mais si cela vous intéresse, consultez la classe aléatoire décrite dans le lien.

Pour 10 et 10 ** 24

 rand(10**24-10)+10 
 def random_int(min, max) rand(max - min) + min end 

Et voici une référence rapide à la fois pour #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