Obrigado! Acho que vou ficar com o velho eo bom método :)
Misha Moroshko
32
Essa é uma péssima idéia, principalmente se os tamanhos a e b forem desconhecidos. Tente (100000000000000000..100000000000000) .to_a.sample e veja o que eu quero dizer
:)
4
@pixelearth, se você tem uma idéia melhor, que concorda com a pergunta, você pode postar.
Nakilon
rand(a..b)não funciona, ele divide: TypeError: can't convert Range into Integer. Nem sequer é suportado no Ruby 2.0
fguillen
2
@guguen Funciona para mim no 1.9.3, não sei por que não está funcionando para você.
Michael Dorst
87
Random.new.rand(a..b)
Onde aestá o seu valor mais baixo e o bseu valor mais alto.
A diferença importante a ser observada é que, se você acabou de ligar, rand()está ligando Kernel#rand, o que suporta apenas um maxargumento. Se você deseja passar um intervalo, precisa usar Random#rand, o que significa que você deve implementar dessa maneira. 1
Veja esta resposta: existe no Ruby 1.9.2, mas não nas versões anteriores. Pessoalmente, acho que rand (8) + 3 é bom, mas se você estiver interessado, confira a classe Random descrita no link.
E aqui está uma referência rápida para ambos #samplee #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.8700000.0200003.890000(3.888147)
rand 0.1500000.0000000.150000(0.153557)
def my_rand(x, y); rand(y - x) + x; end
y - x + 1
a propósito.rand(3..10)
Respostas:
UPDATE: Ruby 1.9.3
Kernel#rand
também aceita intervaloshttp://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
A conversão em array pode ser muito cara e desnecessária.
Ou
Matriz # amostra
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.
fonte
rand(a..b)
não funciona, ele divide:TypeError: can't convert Range into Integer
. Nem sequer é suportado no Ruby 2.0Onde
a
está o seu valor mais baixo e ob
seu valor mais alto.fonte
rand()
está ligandoKernel#rand
, o que suporta apenas ummax
argumento. Se você deseja passar um intervalo, precisa usarRandom#rand
, o que significa que você deve implementar dessa maneira. 1Kernel # rand
fonte
Observe a diferença entre os operadores de intervalo:
fonte
Veja esta resposta: existe no Ruby 1.9.2, mas não nas versões anteriores. Pessoalmente, acho que rand (8) + 3 é bom, mas se você estiver interessado, confira a classe Random descrita no link.
fonte
Para 10 e 10 ** 24
fonte
rand(10..10**24)
fonte
E aqui está uma referência rápida para ambos
#sample
e#rand
:Então, fazer
rand(a..b)
é a coisa certafonte