Como obter um número aleatório em Ruby

Como posso gerar um número aleatório entre {[[0]} e n?

Author: techdreams, 2008-10-13

17 answers

Uso rand(range)

De Números Aleatórios Ruby:

Se precisasse de um inteiro aleatório para simular um rolo de um dado de seis lados, usaria: 1 + rand(6). Um rolo em dados pode ser simulado com 2 + rand(6) + rand(6).

Finalmente, se precisar de um carro flutuante Aleatório, basta ligar sem argumentos.

Como Marc-André Lafortune menciona em sua resposta abaixo (subam para cima)), Ruby 1.9.2 tem o seu próprio Random classe (que o próprio Marc-André ajudou a depurar , daí o alvo 1.9.2 para essa característica).

Por exemplo, neste jogo onde você precisa adivinhar 10 números , Você pode inicializá-los com:

10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

Nota:

É por isso que o equivalente a Random.new.rand(20..30) seria 20 + Random.rand(11), dado que Random.rand(int) devolve " um inteiro aleatório maior ou igual a zero e menos do que o argumento ."20..30 inclui 30, preciso de arranjar um número aleatório entre 0 e 11, excluindo 11.

 889
Author: VonC, 2018-04-06 14:35:56

Enquanto você pode usar rand(42-10) + 10 para obter um número aleatório entre 10 e 42 (onde 10 é inclusiva e 42 exclusiva), há uma maneira melhor desde o Ruby 1.9.3, onde você é capaz de chamada:

rand(10...42) # => 13

Disponível para todas as versões de Ruby, exigindo a minha backports gem.

O Ruby 1.9.2 também introduziu a classe Random para que possa criar os seus próprios objectos geradores de números aleatórios e tenha uma boa API:

r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
A própria classe age como um gerador aleatório. você liga diretamente:
Random.rand(10...42) # => same as rand(10...42)

Notas sobre Random.new

Na maioria dos casos, o mais simples é usar rand ou Random.rand. Criar um novo gerador aleatório cada vez que você quer um número aleatório é uma realmente má idéia . Se fizer isto, irá obter as propriedades aleatórias do algoritmo de semeadura inicial que são atrozes em comparação com as propriedades do próprio gerador aleatório.

Se utilizar Random.new, deve chamá - lo tão raramente como possível , por exemplo uma vez como MyApp::Random = Random.new e usá-lo em todos os outros lugares.

Os casos em que Random.new é útil são os seguintes:

    Estás a escrever uma jóia e não queres interferir com a sequência de rand/Random.rand que os principais programas podem estar confiando em
  • quer sequências reprodutíveis separadas de números aleatórios (digamos um por fio)
  • Você quer ser capaz de salvar e retomar uma sequência reprodutível de números aleatórios (fácil como Random Os objectos podem marshalled)
 575
Author: Marc-André Lafortune, 2015-02-12 17:38:27

Se você não está apenas procurando por um número, mas também hex ou uuid vale a pena mencionar que o SecureRandom módulo encontrado o seu caminho de ActiveSupport para o ruby core em 1.9.2+. Assim, sem a necessidade de um quadro completo:

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"

Está aqui documentado: Ruby 1.9.3 - Módulo: SecureRandom (lib/securerandom.rb)

 44
Author: Thomas Fankhauser, 2013-08-08 08:42:19

Você pode gerar um número aleatório com o método rand. O argumento passado para o método rand deve ser um integer ou um range, e devolve um número aleatório correspondente Dentro do intervalo:

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
Author: MattD, 2014-03-21 00:54:21
Bem, eu descobri. Aparentemente há um edifício (?) função chamada rand:
rand(n + 1)
Se alguém responder com uma resposta mais detalhada, vou marcar isso como a resposta correcta.
 21
Author: Mark A. Nicolosi, 2008-10-13 18:10:10
E isto?
n = 3
(0..n).to_a.sample
 19
Author: Rimian, 2012-05-23 06:02:22

Resposta mais simples à pergunta:

rand(0..n)
 11
Author: 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

Note que a opção de intervalo só está disponível em versões mais recentes(1.9+ eu acredito) do ruby.

 6
Author: Josh, 2012-11-15 23:31:45

Intervalo = 10..50

Rand(intervalo)

Ou

Intervalo. to_a. amostra

Ou

Intervalo. to_ A. shuffle (Isto irá baralhar toda a lista e poderá escolher um número aleatório pela primeira ou pela última vez ou por qualquer desta lista para escolher um aleatório)

 6
Author: sumit, 2016-04-29 10:32:32

Pode simplesmente utilizar random_number.

Se for dado um número inteiro positivo como n, random_number devolve um número inteiro: 0 random_number

Usa-o assim:

any_number = SecureRandom.random_number(100) 

A saída será qualquer número entre 0 e 100.

 5
Author: techdreams, 2017-01-16 11:58:57

Este link vai ser útil em relação a isto;

Http://ruby-doc.org/core-1.9.3/Random.html

E um pouco mais de clareza abaixo sobre os números aleatórios em ruby;

Gerar um número inteiro de 0 a 10

puts (rand() * 10).to_i

Gerar um número de 0 a 10 De uma forma mais legível

puts rand(10)

Gerar um número de 10 a 15 Incluindo 15

puts rand(10..15)

Números Aleatórios Não Aleatórios

Gerar a mesma sequência de números sempre o programa é executado

srand(5)

Gerar 10 números aleatórios

puts (0..10).map{rand(0..10)}
 4
Author: Sam, 2013-12-24 17:38:49

Podes fazer rand (range)

x = rand(1..5)
 3
Author: Snifferdog, 2015-08-22 23:09:00

Tentar array#shuffle Método de aleatorização

array = (1..10).to_a
array.shuffle.first
 2
Author: LuckyElf, 2015-01-23 18:15:29
Talvez te ajude. Uso isto na minha aplicação
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

Funciona bem para mim

 2
Author: amarradi, 2016-03-11 13:59:43
Que tal este?
num = Random.new
num.rand(1..n)
 2
Author: Juan Dela Cruz, 2016-03-11 14:31:35

A maneira fácil de obter um número aleatório em ruby é,

def random    
  (1..10).to_a.sample.to_s
end
 1
Author: ysk, 2017-02-16 10:04:47

Não se esqueça de semear o RNG comsrand () primeiro.

 0
Author: Liebach, 2008-10-13 18:15:52