Respostas:
Usar rand(range)
Dos números aleatórios do Ruby :
Se você precisava de um número inteiro aleatório para simular um rolo de um dado de seis lados, você usaria:
1 + rand(6). Um rolo de dados pode ser simulado com2 + rand(6) + rand(6).Finalmente, se você precisar apenas de uma flutuação aleatória, basta ligar
randsem argumentos.
Como Marc-André Lafortune menciona em sua resposta abaixo (vá para votação) , Ruby 1.9.2 tem sua própria Randomclasse (que o próprio Marc-André ajudou a depurar , daí o alvo 1.9.2 para esse recurso).
Por exemplo, neste jogo em que 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:
Usar Random.new.rand(20..30)(usar Random.new) geralmente não seria uma boa ideia, como explicado em detalhes (novamente) por Marc-André Lafortune , em sua resposta (novamente).
Porém, se você não usar Random.new, o método de classerand usará apenas um maxvalor, e não um Range, como o corrimão (energeticamente) aponta no comentário (e conforme documentado nos documentos paraRandom ). Somente o método de instância pode receber a Range, 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), pois Random.rand(int)retorna "um número inteiro aleatório maior ou igual a zero e menor que o argumento ". 20..30inclui 30, preciso criar um número aleatório entre 0 e 11, excluindo 11.
Randomturma, mas é uma péssima idéia ligar Random.newvárias vezes, como no seu exemplo. Eu editei minha resposta para afirmar isso.
Random.rand não aceitar um intervalo, na verdade. (Desde 1.9.3, eu acredito.)
Embora você possa usar rand(42-10) + 10para obter um número aleatório entre 10e 42(onde 10 é inclusivo e 42 exclusivo), existe uma maneira melhor desde o Ruby 1.9.3, onde você pode chamar:
rand(10...42) # => 13
Disponível para todas as versões do Ruby, exigindo minha backportsgema.
O Ruby 1.9.2 também introduziu a Randomclasse para que você possa criar seus próprios objetos geradores de números aleatórios e tenha uma ótima API:
r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"
A Randomprópria classe atua como um gerador aleatório, então você chama diretamente:
Random.rand(10...42) # => same as rand(10...42)
Notas sobre Random.new
Na maioria dos casos, o mais simples é usar randou Random.rand. Criar um novo gerador aleatório sempre que você desejar um número aleatório é uma péssima idéia . Se você fizer isso, obterá as propriedades aleatórias do algoritmo de propagação inicial que são atrozes em comparação com as propriedades do próprio gerador aleatório .
Se você usar Random.new, deverá chamá-lo o mais raramente possível , por exemplo, uma vez MyApp::Random = Random.newe usá-lo em qualquer outro lugar.
Os casos em que Random.newsão úteis são os seguintes:
rand/ na Random.randqual os principais programas podem confiarRandomobjetos podem ser organizados)backportsgem é simplesmente uma coleção de métodos que são novos no RUby 1.8.7, 1.9.1, 1.9.2, mas implementados no Ruby. Eu uso o RubySpec para garantir que os resultados sejam compatíveis com o Ruby.
Random.rand(10..42)não funciona. O Random.randmétodo de classe não aceita um intervalo. (Ruby 1.9.2p180)
Se você não está apenas procurando por um número, mas também por hexadecimal ou uuid, vale a pena mencionar que o SecureRandommódulo encontrou o caminho do ActiveSupportnúcleo de rubi no 1.9.2+. Portanto, sem a necessidade de uma estrutura completa:
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á documentado aqui: Ruby 1.9.3 - Módulo: SecureRandom (lib / securerandom.rb)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()não tem um alcance, então não. Você provavelmente desejaria algo como SecureRandom.random_number(10_000)(para 0-9999) ou SecureRandom.random_number(9_000)+1_000(para 1000-9999).
Você pode gerar um número aleatório com o randmétodo O argumento passado para o randmétodo deve ser um integerou rangeae retorna 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(1..6)leituras mais claras do que as respostas principais rand(6)+1.
Bem, eu descobri. Aparentemente, existe uma função interna (?) Chamada rand:
rand(n + 1)
Se alguém responder com uma resposta mais detalhada, marcarei isso como a resposta correta.
Resposta mais simples à pergunta:
rand(0..n)
Você pode simplesmente usar random_number.
Se um número inteiro positivo for dado como n, random_numberretornará um número inteiro: 0 <=random_number <n.
Use-o assim:
any_number = SecureRandom.random_number(100)
A saída será qualquer número entre 0 e 100.
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Observe que a opção range está disponível apenas nas versões mais recentes (mais de 1.900 eu acredito) do ruby.
ruby 1.9.3+. Não funcionou 1.9.2quando tentei pelo menos.
range = 10..50
margem (intervalo)
ou
range.to_a.sample
ou
range.to_a.shuffle (isso embaralha toda a matriz e você pode escolher um número aleatório primeiro ou último ou qualquer um deles para selecionar um aleatório)
range.to_a.sampleé uma péssima ideia quando a amostra é grande.
você pode fazer rand (alcance)
x = rand(1..5)
Este link será útil em relação a isso;
http://ruby-doc.org/core-1.9.3/Random.html
E um pouco mais de clareza abaixo sobre os números aleatórios em rubi;
Gere um número inteiro de 0 a 10
puts (rand() * 10).to_i
Gere um número de 0 a 10 de uma maneira mais legível
puts rand(10)
Gere um número de 10 a 15, incluindo 15
puts rand(10..15)
Números aleatórios não aleatórios
Gere a mesma sequência de números sempre que o programa for executado
srand(5)
Gere 10 números aleatórios
puts (0..10).map{rand(0..10)}
Talvez isso te ajude. Eu uso isso no meu aplicativo
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
Isso funciona bem para mim
Que tal este?
num = Random.new
num.rand(1..n)
Tente array#shufflemétodo para randomização
array = (1..10).to_a
array.shuffle.first
.shuffle.firstpor .sample!
srand <some_number>antes de escrever orandcódigo fornecerá uma sequência pseudo-aleatória determinística (ou seja, repetível), se você precisar. ruby-doc.org/core-2.5.6/Random.html#method-c-srand