Para gerar um número aleatório entre 3 e 10, por exemplo, eu uso: rand(8) + 3
Existe uma maneira melhor de fazer isso (algo como rand(3, 10)
)?
y - x + 1
a propósito.
rand(3..10)
Para gerar um número aleatório entre 3 e 10, por exemplo, eu uso: rand(8) + 3
Existe uma maneira melhor de fazer isso (algo como rand(3, 10)
)?
y - x + 1
a propósito.
rand(3..10)
Respostas:
UPDATE: Ruby 1.9.3 Kernel#rand
também aceita intervalos
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
A conversão em array pode ser muito cara e desnecessária.
(a..b).to_a.sample
Ou
[*a..b].sample
Padrão no Ruby 1.8.7+.
Nota: foi nomeado #choice em 1.8.7 e renomeado em versões posteriores.
Mas, de qualquer forma, a geração de array precisa de recursos e a solução que você já escreveu é a melhor que você pode fazer.
Random.new.rand(a..b)
Onde a
está o seu valor mais baixo e o b
seu valor mais alto.
rand()
está ligando Kernel#rand
, o que suporta apenas um max
argumento. Se você deseja passar um intervalo, precisa usar Random#rand
, o que significa que você deve implementar dessa maneira. 1
rand(3..10)
Quando max é um Range, rand retorna um número aleatório em que range.member? (Number) == true.
Observe a diferença entre os operadores de intervalo:
3..10 # includes 10
3...10 # doesn't include 10
E aqui está uma referência rápida para ambos #sample
e #rand
:
irb(main):014:0* Benchmark.bm do |x|
irb(main):015:1* x.report('sample') { 1_000_000.times { (1..100).to_a.sample } }
irb(main):016:1> x.report('rand') { 1_000_000.times { rand(1..100) } }
irb(main):017:1> end
user system total real
sample 3.870000 0.020000 3.890000 ( 3.888147)
rand 0.150000 0.000000 0.150000 ( 0.153557)
Então, fazer rand(a..b)
é a coisa certa
def my_rand(x, y); rand(y - x) + x; end