ti-enxame.com

Como obter um número aleatório em Ruby

Como faço para gerar um número aleatório entre 0 e n?

757
Mark A. Nicolosi

Use Rand(range)

De Ruby Random Numbers :

Se você precisasse de um inteiro aleatório para simular um lançamento de um dado de seis lados, você usaria: 1 + Rand(6). Um roll no craps poderia ser simulado com 2 + Rand(6) + Rand(6).

Finalmente, se você só precisa de um float aleatório, apenas chame Rand sem argumentos.


Como Marc-André Lafortune menciona in sua resposta abaixo (vá em frente }, Ruby 1.9.2 tem sua própria classe Random (que o próprio Marc-André ajudou a depurar , portanto, o 1.9.2 alvo para esse recurso).

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 de Random.new.Rand(20..30) seria 20 + Random.Rand(11), já que Random.Rand(int) retorna “um inteiro aleatório maior ou igual a zero e menor que o argumento ”. 20..30 inclui 30, eu preciso criar um número aleatório entre 0 e 11, excluindo 11.

930
VonC

Enquanto você pode usar Rand(42-10) + 10 para obter um número aleatório entre 10 e 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 my backports gem.

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

r = Random.new
r.Rand(10...42) # => 22
r.bytes(3) # => "rnd"

A classe Random 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 Rand ou Random.Rand. Criar um novo gerador aleatório cada vez que você quiser um número aleatório é uma idéia realmente má. Se você fizer isso, 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 você usar Random.new, você deve chamá-lo o mais raramente possível, por exemplo, uma vez como MyApp::Random = Random.new e usá-lo em qualquer outro lugar.

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

  • você está escrevendo uma gema e não quer interferir na sequência de Rand/Random.Rand que os programas principais podem estar confiando
  • você quer sequências reproduzíveis separadas de números aleatórios (digamos um por thread)
  • você quer ser capaz de salvar e retomar uma seqüência reproduzível de números aleatórios (fácil como Random objetos podem ser organizados)
582
Marc-André Lafortune

Se você não está apenas procurando por um número, mas também hex ou uuid, vale a pena mencionar que o módulo SecureRandom encontrou seu caminho de ActiveSupport para o núcleo Ruby em 1.9.2+. Então, sem a necessidade de um framework 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á documentado aqui: Ruby 1.9.3 - Módulo: SecureRandom (lib/securerandom.rb)

45
Thomas Fankhauser

Você pode gerar um número aleatório com o método Rand. O argumento passado para o método Rand deve ser integer ou range e 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
35
user1389938

Bem, eu percebi isso. Aparentemente, há uma função interna (?) Chamada Rand:

Rand(n + 1)

Se alguém responder com uma resposta mais detalhada, marcaremos isso como a resposta correta.

21
Mark A. Nicolosi

O que sobre isso?

n = 3
(0..n).to_a.sample
18
Rimian

Resposta mais simples à pergunta:

Rand(0..n)
12
sqrcompass

intervalo = 10,50

Rand (intervalo)

ou

range.to_a.sample

ou

range.to_a.shuffle (isto irá misturar toda a matriz e você pode escolher um número aleatório por primeiro ou último ou qualquer desta matriz para escolher um aleatório)

6
sumit
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 range só está disponível em versões mais recentes (1.9+ eu acredito) do Ruby.

6
Josh

Você pode simplesmente usar random_number.

Se um inteiro positivo é dado como n, random_number retorna um inteiro: 0 <= random_number <n.

Use assim:

any_number = SecureRandom.random_number(100) 

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

5
techdreams

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

http://Ruby-doc.org/core-1.9.3/Random.html

E mais alguma clareza abaixo sobre os números aleatórios em Ruby;

Gere um inteiro de 0 a 10

puts (Rand() * 10).to_i

Gere um número de 0 a 10 de uma forma 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 toda vez que o programa é executado

srand(5)

Gere 10 números aleatórios

puts (0..10).map{Rand(0..10)}
4
Sam

você pode fazer Rand (range)

x = Rand(1..5)
4
Snifferdog

Talvez 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

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

Isso funciona bem para mim

2
amarradi

Que tal este?

num = Random.new
num.Rand(1..n)
2
Juan Dela Cruz

Tente o método array#shuffle para randomização

array = (1..10).to_a
array.shuffle.first
2
LuckyElf

Maneira fácil de obter um número aleatório em Ruby é,

def random    
  (1..10).to_a.sample.to_s
end
2
ysk

Não se esqueça de semear o RNG com srand () first.

0
Liebach

use a função 'Rand'

Rand(10)

0