Comment obtenir un numéro au hasard dans Ruby

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

713
demandé sur techdreams 2008-10-13 22:07:24

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é avec 2 + 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:

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.

889
répondu VonC 2018-04-06 14:35:56

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)
575
répondu Marc-André Lafortune 2015-02-12 17:38:27

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)

44
répondu Thomas Fankhauser 2013-08-08 08:42:19

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
34
répondu MattD 2014-03-21 00:54:21

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.

21
répondu Mark A. Nicolosi 2008-10-13 18:10:10

et ça?

n = 3
(0..n).to_a.sample
19
répondu Rimian 2012-05-23 06:02:22

réponse la plus simple à la question:

rand(0..n)
11
répondu sqrcompass 2015-02-20 10:45:54
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.

6
répondu Josh 2012-11-15 23:31:45

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)

6
répondu sumit 2016-04-29 10:32:32

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.

5
répondu techdreams 2017-01-16 11:58:57

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)}
4
répondu Sam 2013-12-24 17:38:49

vous pouvez le faire rand(plage)

x = rand(1..5)
3
répondu Snifferdog 2015-08-22 23:09:00

Essayer array#shuffle méthode de randomisation

array = (1..10).to_a
array.shuffle.first
2
répondu LuckyElf 2015-01-23 18:15:29

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

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

Il fonctionne très bien pour moi

2
répondu amarradi 2016-03-11 13:59:43

et celui-ci?

num = Random.new
num.rand(1..n)
2
répondu Juan Dela Cruz 2016-03-11 14:31:35

façon facile d'obtenir le nombre aléatoire dans ruby est,

def random    
  (1..10).to_a.sample.to_s
end
1
répondu ysk 2017-02-16 10:04:47

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

0
répondu Liebach 2008-10-13 18:15:52