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)
)?
y - x + 1
au fait.
rand(3..10)
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)
)?
y - x + 1
au fait.
rand(3..10)
Réponses:
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 matrice peut être trop coûteuse et inutile.
(a..b).to_a.sample
Ou
[*a..b].sample
Standard dans Ruby 1.8.7+.
Remarque: a été nommé #choice dans la 1.8.7 et renommé dans les versions ultérieures.
Mais de toute façon, la génération d'un 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)
Où a
est votre valeur la plus basse et b
votre valeur la plus élevée.
rand()
vous appelez Kernel#rand
, ce qui ne prend en charge qu'un max
argument. Si vous voulez passer une plage, vous devez utiliser Random#rand
, ce qui signifie que vous devez implémenter de cette façon. +1
rand(3..10)
Lorsque max est un Range, rand renvoie un nombre aléatoire où range.member? (Number) == true.
Notez simplement la différence entre les opérateurs de plage:
3..10 # includes 10
3...10 # doesn't include 10
Et voici une référence 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)
Alors, faire rand(a..b)
est la bonne chose
def my_rand(x, y); rand(y - x) + x; end