Como faço para gerar um número aleatório entre 0
e n
?
ruby-on-rails
ruby
ruby-on-rails-3
ruby-on-rails-4
random
Mark A. Nicolosi
fonte
fonte
srand <some_number>
antes de escrever orand
có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-srandRespostas:
Usar
rand(range)
Dos números aleatórios do Ruby :
Como Marc-André Lafortune menciona em sua resposta abaixo (vá para votação) , Ruby 1.9.2 tem sua própria
Random
classe (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:
Nota:
Usar
Random.new.rand(20..30)
(usarRandom.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 ummax
valor, e não umRange
, como o corrimão (energeticamente) aponta no comentário (e conforme documentado nos documentos paraRandom
). Somente o método de instância pode receber aRange
, como ilustrado por gerar um número aleatório com 7 dígitos .É por isso que o equivalente a
Random.new.rand(20..30)
seria20 + Random.rand(11)
, poisRandom.rand(int)
retorna "um número inteiro aleatório maior ou igual a zero e menor que o argumento ".20..30
inclui 30, preciso criar um número aleatório entre 0 e 11, excluindo 11.fonte
Random
turma, mas é uma péssima idéia ligarRandom.new
vá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) + 10
para obter um número aleatório entre10
e42
(onde 10 é inclusivo e 42 exclusivo), existe uma maneira melhor desde o Ruby 1.9.3, onde você pode chamar:Disponível para todas as versões do Ruby, exigindo minha
backports
gema.O Ruby 1.9.2 também introduziu a
Random
classe para que você possa criar seus próprios objetos geradores de números aleatórios e tenha uma ótima API:A
Random
própria classe atua como um gerador aleatório, então você chama diretamente:Notas sobre
Random.new
Na maioria dos casos, o mais simples é usar
rand
ouRandom.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 vezMyApp::Random = Random.new
e usá-lo em qualquer outro lugar.Os casos em que
Random.new
são úteis são os seguintes:rand
/ naRandom.rand
qual os principais programas podem confiarRandom
objetos podem ser organizados)fonte
backports
gem é 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. ORandom.rand
mé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
SecureRandom
módulo encontrou o caminho doActiveSupport
núcleo de rubi no 1.9.2+. Portanto, sem a necessidade de uma estrutura completa:Está documentado aqui: Ruby 1.9.3 - Módulo: SecureRandom (lib / securerandom.rb)
fonte
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
não tem um alcance, então não. Você provavelmente desejaria algo comoSecureRandom.random_number(10_000)
(para 0-9999) ouSecureRandom.random_number(9_000)+1_000
(para 1000-9999).Você pode gerar um número aleatório com o
rand
método O argumento passado para orand
método deve ser uminteger
ourange
ae retorna um número aleatório correspondente dentro do intervalo:fonte
rand(1..6)
leituras mais claras do que as respostas principaisrand(6)+1
.Bem, eu descobri. Aparentemente, existe uma função interna (?) Chamada rand:
Se alguém responder com uma resposta mais detalhada, marcarei isso como a resposta correta.
fonte
Que tal isso?
fonte
rand
O (1).Resposta mais simples à pergunta:
fonte
Você pode simplesmente usar
random_number
.Se um número inteiro positivo for dado como n,
random_number
retornará um número inteiro: 0 <=random_number
<n.Use-o assim:
A saída será qualquer número entre 0 e 100.
fonte
Observe que a opção range está disponível apenas nas versões mais recentes (mais de 1.900 eu acredito) do ruby.
fonte
ruby 1.9.3+
. Não funcionou1.9.2
quando 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)
fonte
range.to_a.sample
é uma péssima ideia quando a amostra é grande.você pode fazer rand (alcance)
fonte
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
Gere um número de 0 a 10 de uma maneira mais legível
Gere um número de 10 a 15, incluindo 15
Números aleatórios não aleatórios
Gere a mesma sequência de números sempre que o programa for executado
Gere 10 números aleatórios
fonte
A maneira mais fácil de obter números aleatórios em ruby é,
fonte
Talvez isso te ajude. Eu uso isso no meu aplicativo
https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb
Isso funciona bem para mim
fonte
Que tal este?
fonte
Tente
array#shuffle
método para randomizaçãofonte
.shuffle.first
por.sample
!Não se esqueça de propagar o RNG com srand () primeiro.
fonte