778 votes

Comment obtenir un nombre aléatoire en Ruby ?

<p>En Ruby, comment pouvez-vous générer un nombre aléatoire compris entre <code></code> et <code></code> ?</p>

945voto

VonC Points 414372

Quel est le problème avec rand(range)?

De Ruby Nombres Aléatoires:

Si vous avez besoin d'un nombre entier aléatoire pour simuler un rouleau de un à six côtés de mourir, vous pouvez utiliser: 1 + rand(6). Un rouleau dans le craps peut être simulé avec 2 + rand(6) + rand(6).

Enfin, si vous avez juste besoin d'un random float, appelez - rand sans arguments.


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

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

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

Note:

C'est pourquoi l'équivalent d' Random.new.rand(20..30) serait 20 + Random.rand(11), depuis Random.rand(int) retours "un nombre entier aléatoire supérieur ou égal à zéro et inférieur à l'argument." 20..30 comprend 30, j'ai besoin de venir avec un nombre aléatoire entre 0 et 11, à l'exclusion des 11.

589voto

Vous pouvez utiliser rand(42-10) + 10 pour obtenir un nombre aléatoire entre 10 et 42 (où 10 est inclusive et 42 exclusif).

Ruby 1.9.2 introduit également l' Random classe de sorte que vous pouvez maintenant créer votre propre générateur de nombre aléatoire des objets et a une belle API:

r = Random.new
r.rand(10...42) # => 22

L' Random de la classe elle-même agit comme un générateur aléatoire, de sorte que vous appeler directement:

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

En Ruby 1.9.3, vous êtes en mesure d'appeler:

Random.rand(10...42) # or simply `rand(10...42)`

Disponible pour toutes les versions de Ruby en exigeant que mes backports gem.

Notes sur l' Random.new

Dans la plupart des cas, le plus simple est d'utiliser rand ou Random.rand. La création d'un nouveau générateur aléatoire chaque fois que vous voulez un nombre aléatoire est une très mauvaise idée. Si vous faites cela, vous obtiendrez les propriétés aléatoires de l'amorçage initial de l'algorithme qui sont atroces par rapport à la proporties de l' aléatoire générateur lui-même.

Si vous utilisez Random.new, vous devez donc appeler le plus rarement possible, par exemple, une fois qu' MyApp::Random = Random.new et l'utiliser partout ailleurs.

Le cas où l' Random.new est utile sont les suivantes:

  • vous souhaitez utiliser la nouvelle API (comme bytesou rand avec un argument de plage en Ruby 1.9.2)
  • vous écrivez un bijou et ne veux pas interférer avec la séquence de rand/Random.rand que les principaux programmes en s'appuyant sur
  • vous voulez séparer reproductible des séquences de nombres aléatoires (dire par thread)
  • vous voulez être en mesure de sauvegarder et de reprendre une reproductibilité de la séquence de nombres aléatoires (facile qu' Random objets peuvent rassemblés)

46voto

Thomas Fankhauser Points 1899
<p>Si vous êtes à la recherche non seulement pour un certain nombre mais aussi de sortilège ou uuid, il est à noter que le <code></code> module a trouvé son chemin de <code></code> à coeur rubis en 1.9.2+. Donc sans la nécessité d’un cadre complet soufflé :<pre><code></code></pre><p>Il est documenté ici : <a href="http://rubydoc.info/stdlib/securerandom/1.9.3/SecureRandom">Ruby 1.9.3 - Module : SecureRandom (lib/securerandom.rb)</a></p></p>

17voto

Rimian Points 7805
Et ça?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X