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)
)?
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
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.
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)
Lorsque max est une plage, Rand renvoie un nombre aléatoire où plage.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
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.
def random_int(min, max)
Rand(max - min) + min
end
Pour 10 et 10 ** 24
Rand(10**24-10)+10
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