Comment générer un nombre aléatoire entre 0
et n
?
ruby-on-rails
ruby
ruby-on-rails-3
ruby-on-rails-4
random
Mark A. Nicolosi
la source
la source
srand <some_number>
avant d'écrire durand
code vous donnera une séquence pseudo-aléatoire déterministe (c'est-à-dire répétable), si vous en avez besoin. ruby-doc.org/core-2.5.6/Random.html#method-c-srandRéponses:
Utilisation
rand(range)
De Ruby Random Numbers :
Comme Marc-André Lafortune le mentionne dans sa réponse ci-dessous (allez en voter) , Ruby 1.9.2 a sa propre
Random
classe (que Marc-André lui-même a aidé à déboguer , d'où la cible 1.9.2 pour cette fonctionnalité).Par exemple, dans ce jeu où vous devez deviner 10 nombres , vous pouvez les initialiser avec:
Remarque:
Utiliser
Random.new.rand(20..30)
(utiliserRandom.new
) en général ne serait pas une bonne idée, comme expliqué (encore) en détail par Marc-André Lafortune , dans sa réponse (encore).Mais si vous n'utilisez pas
Random.new
, la méthode de classerand
ne prend que lamax
valeur, pasRange
, comme banister points (énergie) dans le commentaire (et comme indiqué dans les documents pourRandom
). Seule la méthode d'instance peut prendre unRange
, comme illustré par générer un nombre aléatoire à 7 chiffres .C'est pourquoi l'équivalent de
Random.new.rand(20..30)
serait20 + Random.rand(11)
, puisqueRandom.rand(int)
renvoie «un entier aléatoire supérieur ou égal à zéro et inférieur à l'argument ».20..30
comprend 30, je dois trouver un nombre aléatoire entre 0 et 11, à l'exclusion de 11.la source
Random
classe, mais c'est une idée terrible d'appelerRandom.new
plusieurs fois comme dans votre exemple. J'ai édité ma réponse pour le dire.Random.rand
n'accepte une gamme, en fait. (Depuis 1.9.3, je crois.)Bien que vous puissiez utiliser
rand(42-10) + 10
pour obtenir un nombre aléatoire entre10
et42
(où 10 est inclusif et 42 exclusif), il existe un meilleur moyen depuis Ruby 1.9.3, où vous pouvez appeler:Disponible pour toutes les versions de Ruby en nécessitant mon
backports
bijou.Ruby 1.9.2 a également introduit la
Random
classe afin que vous puissiez créer vos propres objets générateurs de nombres aléatoires et dispose d'une belle API:La
Random
classe elle-même agit comme un générateur aléatoire, vous appelez donc directement:Remarques sur
Random.new
Dans la plupart des cas, le plus simple est d'utiliser
rand
ouRandom.rand
. Créer 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'algorithme d'amorçage initial qui sont atroces par rapport aux propriétés du générateur aléatoire lui-même .Si vous utilisez
Random.new
, vous devez donc l'appeler aussi rarement que possible , par exemple une fois commeMyApp::Random = Random.new
et l'utiliser partout ailleurs.Les cas où cela
Random.new
est utile sont les suivants:rand
/ surRandom.rand
laquelle les programmes principaux peuvent s'appuyerRandom
objets peuvent être rassemblés)la source
backports
bijou est simplement une collection de méthodes qui sont nouvelles pour RUby 1.8.7, 1.9.1, 1.9.2, mais implémentées dans Ruby. J'utilise RubySpec pour m'assurer que les résultats sont compatibles avec Ruby.Random.rand(10..42)
ne marche pas. LaRandom.rand
méthode de classe n'accepte pas de plage. (Ruby 1.9.2p180)Si vous recherchez non seulement un nombre, mais également hex ou uuid, il convient de mentionner que le
SecureRandom
module a trouvé son cheminActiveSupport
vers le noyau rubis dans 1.9.2+. Donc, sans avoir besoin d'un cadre complet:Il est documenté ici: Ruby 1.9.3 - Module: SecureRandom (lib / securerandom.rb)
la source
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
ne prend pas de gamme, donc non. Vous voudriez probablement quelque chose commeSecureRandom.random_number(10_000)
(pour 0-9999) ouSecureRandom.random_number(9_000)+1_000
(pour 1000-9999).Vous pouvez générer un nombre aléatoire avec la
rand
méthode. L'argument passé à larand
méthode doit être uninteger
ou unrange
et renvoie un nombre aléatoire correspondant dans la plage:la source
rand(1..6)
lectures est plus claire que celle de la réponse du hautrand(6)+1
.Eh bien, je l'ai compris. Apparemment, il existe une fonction intégrée (?) Appelée rand:
Si quelqu'un répond par une réponse plus détaillée, je la marquerai comme la bonne réponse.
la source
Et ça?
la source
rand
O (1).Réponse la plus simple à la question:
la source
Vous pouvez simplement utiliser
random_number
.Si un entier positif est donné par n,
random_number
retourne un entier: 0 <=random_number
<n.Utilisez-le comme ceci:
La sortie sera un nombre compris entre 0 et 100.
la source
Notez que l'option de plage n'est disponible que dans les versions plus récentes (1.9+ je crois) de ruby.
la source
ruby 1.9.3+
. Cela n'a pas fonctionné1.9.2
quand j'ai essayé au moins.plage = 10..50
rand (plage)
ou
range.to_a.sample
ou
range.to_a.shuffle (cela va mélanger tout le tableau et vous pouvez choisir un nombre aléatoire en premier ou en dernier ou n'importe lequel de ce tableau pour en choisir un au hasard)
la source
range.to_a.sample
est une mauvaise idée quand l'échantillon est gros.vous pouvez faire du rand (plage)
la source
Ce lien va être utile à ce sujet;
http://ruby-doc.org/core-1.9.3/Random.html
Et un peu plus de clarté ci-dessous sur les nombres aléatoires en rubis;
Génère un entier de 0 à 10
Générer un nombre de 0 à 10 de manière plus lisible
Générer un nombre de 10 à 15 dont 15
Nombres aléatoires non aléatoires
Générez la même séquence de nombres à chaque exécution du programme
Générez 10 nombres aléatoires
la source
Un moyen facile d'obtenir un nombre aléatoire en rubis est,
la source
Peut-être que cela vous aidera. J'utilise ceci dans mon application
https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb
Ça fonctionne bien pour moi
la source
Celui-ci, ça va?
la source
Essayez la
array#shuffle
méthode de randomisationla source
.shuffle.first
par.sample
!N'oubliez pas de semer le RNG avec srand () en premier.
la source