Comment obtenir un numéro au hasard dans Ruby
Comment puis-je générer un nombre aléatoire entre 0
et n
?
17 réponses
Utilisation rand(range)
À Partir De Ruby Nombres Aléatoires :
si vous aviez besoin d'un entier aléatoire pour simuler un rouleau d'un dé à six faces, vous utiliseriez:
1 + rand(6)
. Un roulement dans le craps pourrait être simulé avec2 + rand(6) + rand(6)
.enfin, si vous avez juste besoin d'un flotteur aléatoire, appelez
rand
sans arguments.
As Marc-André Lafortune mentions dans sa réponse ci-dessous (aller upvote it) , Ruby 1.9.2 a sa propre Random
classe (que Marc-André lui-même a aidé à débugger , d'où le 1.9.2 cible pour cette caractéristique).
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]
Note:
-
utiliser
Random.new.rand(20..30)
(utiliserRandom.new
) ne serait généralement pas une bonne idée, comme expliqué en détail (encore) par Marc-André Lafortune , dans sa réponse (encore). -
mais si vous n'utilisez pas
Random.new
, alors la méthode de la classerand
prend seulement une valeurmax
, pas une valeurRange
, comme banister (énergétiquement) indique dans le commentaire (et comme documenté dans le docs pourRandom
). Seule la méthode d'instance peut prendre unRange
, comme illustré par générer un nombre aléatoire avec 7 chiffres .
C'est pourquoi, l'équivalent de Random.new.rand(20..30)
serait 20 + Random.rand(11)
, puisque Random.rand(int)
retourne "un 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.
alors que vous pouvez utiliser rand(42-10) + 10
pour obtenir un nombre aléatoire entre 10
et 42
(où 10 est inclus et 42 exclusif), Il ya une meilleure façon depuis Ruby 1.9.3, où vous êtes en mesure d'appeler:
rand(10...42) # => 13
Disponible pour toutes les versions de Ruby en exigeant mon backports
gem.
Ruby 1.9.2 a également introduit la classe Random
donc vous pouvez créer votre propre générateur de nombres aléatoires
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
la classe Random
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 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 de semis 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 que MyApp::Random = Random.new
et l'utiliser partout ailleurs.
les cas où Random.new
est utile sont les suivants:
- vous écrivez une pierre précieuse et vous 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 être en mesure de sauvegarder et de reprendre une séquence reproductible de nombres aléatoires (facile comme
Random
objets peuvent marshalled)
si vous cherchez non seulement un numéro, mais aussi un hex ou un uuid, il est intéressant de noter que le module SecureRandom
a trouvé son chemin de ActiveSupport
au coeur 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)
vous pouvez générer un nombre aléatoire avec la méthode rand
. L'argument passé à la méthode rand
doit être un integer
ou un range
, et renvoie un nombre aléatoire correspondant dans l'intervalle:
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
J'ai compris. Apparemment, il y a un builtin (?) fonction appelée rand:
rand(n + 1)
si quelqu'un répond avec une réponse plus détaillée, Je marquerai cette réponse comme étant la bonne.
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.
gamme = 10..50
rand(plage)
ou
range.to_a.échantillon
ou
range.to_a.mélangez (cela mélangera l'ensemble du tableau et vous pouvez choisir un nombre aléatoire par Premier ou dernier ou n'importe lequel de ce tableau pour choisir aléatoire un)
vous pouvez simplement utiliser random_number
.
si un entier positif est donné comme n, random_number
renvoie un entier: 0 < = random_number
< N.
utilisez - le comme ceci:
any_number = SecureRandom.random_number(100)
la sortie sera n'importe quel nombre entre 0 et 100.
Ce lien va être utiles concernant ce;
http://ruby-doc.org/core-1.9.3/Random.html
et un peu plus de clarté ci-dessous sur les nombres aléatoires dans ruby;
génère un entier de 0 à 10
puts (rand() * 10).to_i
génère un nombre de 0 à 10 D'une manière plus lisible
puts rand(10)
génère un nombre à partir de 10 à 15 Y compris 15
puts rand(10..15)
Nombres Aléatoires Non Aléatoires
Générer la même séquence de nombres à chaque fois le programme est exécuté
srand(5)
générer 10 nombres aléatoires
puts (0..10).map{rand(0..10)}
Essayer array#shuffle
méthode de randomisation
array = (1..10).to_a
array.shuffle.first
peut-être que ça vous aidera. Je l'utilise dans mon application
https://github.com/rubyworks/facets
class String
# Create a random String of given length, using given character set
#
# Character set is an Array which can contain Ranges, Arrays, Characters
#
# Examples
#
# String.random
# => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
#
# String.random(10)
# => "t8BIna341S"
#
# String.random(10, ['a'..'z'])
# => "nstpvixfri"
#
# String.random(10, ['0'..'9'] )
# => "0982541042"
#
# String.random(10, ['0'..'9','A'..'F'] )
# => "3EBF48AD3D"
#
# BASE64_CHAR_SET = ["A".."Z", "a".."z", "0".."9", '_', '-']
# String.random(10, BASE64_CHAR_SET)
# => "xM_1t3qcNn"
#
# SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
# BASE91_CHAR_SET = ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
# String.random(10, BASE91_CHAR_SET)
# => "S(Z]z,J{v;"
#
# CREDIT: Tilo Sloboda
#
# SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
#
# TODO: Move to random.rb in standard library?
def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
Array.new(len){ chars.sample }.join
end
end
Il fonctionne très bien pour moi
façon facile d'obtenir le nombre aléatoire dans ruby est,
def random
(1..10).to_a.sample.to_s
end