web-dev-qa-db-fra.com

Comment obtenir un nombre aléatoire dans Ruby

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

767
Mark A. Nicolosi

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é 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 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:

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.

937
VonC

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:

  • vous écrivez une gemme et ne voulez pas interférer avec la séquence de Rand/Random.Rand sur laquelle les programmes principaux peuvent compter
  • vous voulez des séquences séparées et reproductibles de nombres aléatoires (disons une par thread)
  • vous voulez pouvoir sauvegarder et reprendre une séquence reproductible de nombres aléatoires (simple, car les objets Random peuvent être organisés)
586

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)

46
Thomas Fankhauser

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
36
user1389938

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.

21
Mark A. Nicolosi

Et ça?

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

Réponse la plus simple à la question:

Rand(0..n)
12
sqrcompass

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)

6
sumit
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).

6
Josh

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.

6
techdreams

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)}
4
Sam

vous pouvez faire Rand (gamme)

x = Rand(1..5)
4
Snifferdog

Un moyen facile d’obtenir un nombre aléatoire dans Ruby est,

def random    
  (1..10).to_a.sample.to_s
end
3
ysk

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"
3
Amol Mohite

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

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

Ça fonctionne bien pour moi

2
amarradi

Celui-ci, ça va?

num = Random.new
num.Rand(1..n)
2
Juan Dela Cruz

Essayez la méthode array#shuffle pour la randomisation

array = (1..10).to_a
array.shuffle.first
2
LuckyElf

N'oubliez pas d'ensemencer le RNG avec srand () en premier.

0
Liebach

utilisez la fonction 'Rand' comme ça

Rand(10)