Comment générer un nombre aléatoire entre 0
et n
?
Utilisez Rand(range)
De Ruby Random Numbers :
Si vous aviez besoin d'un entier aléatoire pour simuler le lancement d'un dé à six faces, vous utiliseriez:
1 + Rand(6)
. Un roulement au craps peut être simulé avec2 + Rand(6) + Rand(6)
.Enfin, si vous avez juste besoin d'un flottant aléatoire, appelez simplement
Rand
sans arguments.
Comme Marc-André Lafortune mentionne dans sa réponse ci-dessous (va voter) , Ruby 1.9.2 a sa propre classe Random
(que Marc-André lui-même a aidé à déboguer , d’où le cible 1.9.2 pour cette fonctionnalité).
Par exemple, dans ce jeu où vous devez deviner 10 nombres , vous pouvez les initialiser avec:
10.times.map{ 20 + Random.Rand(11) }
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]
Remarque:
Utiliser Random.new.Rand(20..30)
(avec Random.new
) ne serait généralement pas une bonne idée, comme expliqué en détail (à nouveau) par Marc-André Lafortune , dans sa réponse (à nouveau ).
Mais si vous n'utilisez pas Random.new
, alors la méthode de classe Rand
ne prend qu'une valeur max
, et non pas Range
, rampe (énergiquement) indique dans le commentaire (et comme indiqué dans le docs pour Random
). Seule la méthode d'instance peut prendre un Range
, comme illustré par générer un nombre aléatoire de 7 chiffres .
C'est pourquoi l'équivalent de Random.new.Rand(20..30)
serait 20 + Random.Rand(11)
, puisque Random.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 compris entre 0 et 11, à l'exclusion de 11.
Bien que vous puissiez utiliser Rand(42-10) + 10
pour obtenir un nombre aléatoire entre 10
et 42
(où 10 est inclusif et 42 exclusifs), il existe un meilleur moyen depuis Ruby 1.9. 3, où vous pouvez appeler:
Rand(10...42) # => 13
Disponible pour toutes les versions de Ruby en demandant mon backports
gem.
Ruby 1.9.2 a également introduit la classe Random
afin que vous puissiez créer vos propres objets générateurs de nombres aléatoires et dispose d'une API Nice:
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. Vous appelez donc directement:
Random.Rand(10...42) # => same as Rand(10...42)
Notes sur Random.new
Dans la plupart des cas, le plus simple consiste à utiliser Rand
ou Random.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 de départ initial qui sont atroces comparées aux propriétés de le 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 comme MyApp::Random = Random.new
et l'utiliser partout ailleurs.
Les cas où Random.new
est utile sont les suivants:
Rand
/Random.Rand
sur laquelle les programmes principaux peuvent compterRandom
peuvent être organisés)Si vous ne recherchez pas seulement un nombre mais également un hex ou uuid, il convient de mentionner que le module SecureRandom
a trouvé son chemin de ActiveSupport
au noyau Ruby de la version 1.9.2+. . Donc, sans la nécessité d'un framework 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 transmis à la méthode Rand
doit être un integer
ou un range
, et 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
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 marque cette réponse comme étant la réponse correcte.
Et ça?
n = 3
(0..n).to_a.sample
Réponse la plus simple à la question:
Rand(0..n)
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 par le premier ou le dernier ou n'importe lequel dans ce tableau pour en choisir un au hasard)
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 de plage n'est disponible que dans les versions les plus récentes de Ruby (1.9+ je crois).
Vous pouvez simplement utiliser random_number
.
Si un entier positif correspond à n, random_number
renvoie un entier: 0 <= random_number
<n.
Utilisez-le comme ceci:
any_number = SecureRandom.random_number(100)
La sortie sera un nombre quelconque compris entre 0 et 100.
Ce lien sera utile à cet égard.
http://Ruby-doc.org/core-1.9.3/Random.html
Et un peu plus de clarté sur les nombres aléatoires en Ruby;
Générer un entier de 0 à 10
puts (Rand() * 10).to_i
Générer un nombre de 0 à 10 de manière plus lisible
puts Rand(10)
Générer un nombre de 10 à 15 dont 15
puts Rand(10..15)
Nombres aléatoires non aléatoires
Générer la même séquence de chiffres à chaque exécution du programme
srand(5)
Générer 10 nombres aléatoires
puts (0..10).map{Rand(0..10)}
vous pouvez faire Rand (gamme)
x = Rand(1..5)
Un moyen facile d’obtenir un nombre aléatoire dans Ruby est,
def random
(1..10).to_a.sample.to_s
end
Dans le langage Ruby, nous avons comme méthode Rand()
. Vous pouvez générer un nombre aléatoire à l'aide de cette méthode. La méthode Rand()
n'aura qu'un argument ou une plage entier. Le type de retour de cette méthode est un nombre entier aléatoire.
Rand() # This Will generates a random number between 0.0 to 1.0
Rand(10) # This Will generates a number between 0 to 10
Rand(1 .. 9) # This Will generates a number between 1 to 10
Rand(1 ... 10) # This Will generates a number between 2 to 9
NOTE: Les nombres produits par
Rand()
suffisent pour une application simple.Mais si vous en avez besoin pour des raisons de sécurité, comme la génération d'un mot de passe unique, la création de jetons de réinitialisation de mot de passe, vous devez utiliser l'une des parties de la bibliothèque standard Ruby qui est
SecureRandom
.
require 'securerandom'
SecureRandom.random_number
=> 0.232
SecureRandom.random_number(100)
=> 72
SecureRandom.hex
=> "87694e9e5231aba6ssdfs3de39c58cdfbe307"
Peut-être que cela vous aide. 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
Ça fonctionne bien pour moi
Celui-ci, ça va?
num = Random.new
num.Rand(1..n)
Essayez la méthode array#shuffle
pour la randomisation
array = (1..10).to_a
array.shuffle.first
N'oubliez pas d'ensemencer le RNG avec srand () en premier.
utilisez la fonction 'Rand' comme çaRand(10)