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) )?

173
demandé sur Nakilon 2010-12-09 08:18:14

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

tableau # échantillon

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.

295
répondu Nakilon 2015-01-29 20:30:13
Random.new.rand(a..b) 

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

85
répondu user1782571 2012-10-29 11:03:20
rand(3..10)

Noyau#rand

quand max est un rang, rand renvoie un nombre aléatoire où rang.membre?(nombre) = = vrai.

11
répondu Dorian 2014-12-16 18:53:35

il suffit de noter la différence entre les opérateurs de gamme:

3..10  # includes 10
3...10 # doesn't include 10
10
répondu Yaniv Preiss 2015-09-03 11:45:40

Voir ce réponse: il est en Ruby 1.9.2, mais pas dans les versions antérieures. Personnellement, je pense que rand (8) + 3 est très bien, mais si vous êtes intéressé vérifier la classe aléatoire décrite dans le lien.

3
répondu bnaul 2017-05-23 11:47:21

pour 10 et 10* * 24

rand(10**24-10)+10
3
répondu xt.and.r 2010-12-09 06:15:23
def random_int(min, max)
    rand(max - min) + min
end
3
répondu Chaseph 2014-04-23 05:07:51

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

2
répondu Vadym Tyemirov 2018-06-26 15:14:56