web-dev-qa-db-fra.com

Comment générer un nombre aléatoire entre a et b dans Ruby?

Pour générer un nombre aléatoire compris 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))?

187
Misha Moroshko

UPDATE: 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 s'avérer trop onéreuse et inutile.


(a..b).to_a.sample

Ou

[*a..b].sample

Array # sample

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

Quoi qu'il en soit, générer un tableau de ressources nécessite des ressources, et la solution que vous avez déjà écrite est la meilleure solution.

318
Nakilon
Random.new.Rand(a..b) 

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

86
user1782571
Rand(3..10)

Noyau # Rand

Lorsque max est une plage, Rand renvoie un nombre aléatoire où plage.membre? (Nombre) == vrai.

12
Dorian

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

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

Voir this answer: il y a dans Ruby 1.9.2, mais pas dans les versions antérieures. Personnellement, je pense que Rand (8) + 3 convient, mais si cela vous intéresse, consultez la classe Random décrite dans le lien.

3
bnaul
def random_int(min, max)
    Rand(max - min) + min
end
3
Chaseph

Pour 10 et 10 ** 24

Rand(10**24-10)+10
3
xt.and.r

Et voici un repère rapide 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

2
Vadym Tyemirov