Como obter um número aleatório em Ruby
Como posso gerar um número aleatório entre {[[0]} e n
?
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:
Finalmente, se precisar de um carro flutuante Aleatório, basta ligar sem argumentos.1 + rand(6)
. Um rolo em dados pode ser simulado com2 + rand(6) + rand(6)
.
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:
Usando
Random.new.rand(20..30)
(usandoRandom.new
), geralmente, não seria uma boa idéia, como explicado em detalhe (novamente) por Marc-André Lafortune, em sua resposta (novamente).Mas se não o fizeres utilizar
Random.new
, depois o método da classerand
apenas toma um valormax
, não umRange
, como banister (energeticamente) aponta no comentário (e como documentado nos documentos de paraRandom
). Apenas o método de instância pode tomar umRange
, como ilustrado por , gerar um número aleatório com 7 dígitos .
É 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.
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
- 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)
rand
/Random.rand
que os principais programas podem estar confiando em
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)
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
rand(n + 1)
Se alguém responder com uma resposta mais detalhada, vou marcar isso como a resposta correcta.
n = 3
(0..n).to_a.sample
Resposta mais simples à pergunta:
rand(0..n)
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.
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)
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.
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)}
Podes fazer rand (range)
x = rand(1..5)
Tentar array#shuffle
Método de aleatorização
array = (1..10).to_a
array.shuffle.first
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
Funciona bem para mim
num = Random.new
num.rand(1..n)
A maneira fácil de obter um número aleatório em ruby é,
def random
(1..10).to_a.sample.to_s
end
Não se esqueça de semear o RNG comsrand () primeiro.