Question Comment obtenir un nombre aléatoire dans Ruby


Comment puis-je générer un nombre aléatoire entre 0 et n?


701
2017-10-13 18:07


origine


Réponses:


Utilisation rand(range)

De Ruby Random Numbers:

Si vous aviez besoin d'un entier aléatoire pour simuler un dé d'un dé à six faces, vous utiliseriez: 1 + rand(6). Un rouleau dans le craps pourrait être simulé avec 2 + rand(6) + rand(6).

Enfin, si vous avez juste besoin d'un flottant aléatoire, appelez simplement rand sans arguments.


Comme Marc-André Lafortune mentions dans sa réponse ci-dessous (aller upvote-le), Ruby 1.9.2 a son propre Random classe (que Marc-André lui-même aidé à déboguer, d'où le 1.9.2 cible pour cette fonctionnalité).

Par exemple, dans ce jeu où vous devez deviner 10 numéros, vous pouvez les initialiser avec:

10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

Remarque:

C'est pourquoi l'équivalent de Random.new.rand(20..30) serait 20 + Random.rand(11), depuis Random.rand(int) renvoie "un entier aléatoire supérieur ou égal à zéro et moins que l'argument" 20..30 inclut 30, je dois trouver un nombre aléatoire entre 0 et 11, à l'exclusion de 11.


878
2017-10-13 18:10



Alors que vous pouvez utiliser rand(42-10) + 10 pour obtenir un nombre aléatoire entre 10 et 42 (où 10 est inclusif et 42 exclusif), il y a une meilleure façon depuis Ruby 1.9.3, où vous pouvez appeler:

rand(10...42) # => 13

Disponible pour toutes les versions de Ruby en exigeant mon backports gemme.

Ruby 1.9.2 a également introduit Random classe afin que vous puissiez créer vos propres objets générateur de nombres aléatoires et a une belle API:

r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"

le Random La classe elle-même agit comme un générateur aléatoire, donc vous appelez directement:

Random.rand(10...42) # => same as rand(10...42)

Notes sur Random.new

Dans la plupart des cas, le plus simple est d'utiliser rand ou Random.rand. Créer un nouveau générateur aléatoire chaque fois que vous voulez un nombre aléatoire est un vraiment mauvaise idée. Si vous faites cela, vous obtiendrez les propriétés aléatoires de l'algorithme d'ensemencement initial qui sont atroces par rapport aux propriétés de la générateur aléatoire lui-même.

Si tu utilises Random.new, vous devriez donc l'appeler aussi rarement que possible, par exemple une fois MyApp::Random = Random.new et l'utilise partout ailleurs.

Les cas où Random.new est utile sont les suivants:

  • vous écrivez une gemme et ne voulez pas interférer avec la séquence de rand/Random.rand que les programmes principaux pourraient compter sur
  • vous voulez des séquences reproductibles séparées de nombres aléatoires (disons un par fil)
  • vous voulez pouvoir enregistrer et reprendre une séquence reproductible de nombres aléatoires Randomles objets peuvent être rassemblés)

570
2018-05-05 14:01



Si vous cherchez non seulement un nombre, mais aussi un hex ou uuid, il est important de mentionner que le SecureRandom module trouvé son chemin à partir de ActiveSupport au noyau de rubis en 1.9.2+. Donc, sans la nécessité d'un cadre complet:

require 'securerandom'

p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88

p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409

p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"

C'est documenté ici: Ruby 1.9.3 - Module: SecureRandom (lib / securerandom.rb)


43
2017-07-20 11:15



Vous pouvez générer un nombre aléatoire avec le rand méthode. L'argument transmis à la rand méthode devrait être un integer ou un rangeet renvoie un nombre aléatoire correspondant dans la plage:

rand(9)       # this generates a number between 0 to 8
rand(0 .. 9)  # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range

32
2017-12-12 20:12



Eh bien, je l'ai compris. Apparemment, il existe une fonction intégrée (?) Appelée rand:

rand(n + 1)

Si quelqu'un répond avec une réponse plus détaillée, je marquerai cela comme la bonne réponse.


20
2017-10-13 18:10



Et ça?

n = 3
(0..n).to_a.sample

18
2018-05-23 06:02



Réponse la plus simple à la question:

rand(0..n)

11
2018-02-19 18:53



rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

Notez que l'option range n'est disponible que dans les versions plus récentes (1.9+ je crois) de ruby.


6
2017-11-15 23:31