Dzięki! Myślę, że pozostanę przy starej i dobrej metodzie :)
Misha Moroshko,
32
To naprawdę zły pomysł, szczególnie jeśli twoje aib mają nieznane rozmiary. Spróbuj (100000000000000000..100000000000000) .to_a.sample i zobacz, co mam na myśli
:)
4
@pixelearth, jeśli masz lepszy pomysł, który odpowiada na pytanie, możesz pisać.
Nakilon,
rand(a..b)nie działa, to dzieli: TypeError: can't convert Range into Integer. Nie jest nawet obsługiwany w Ruby 2.0
fguillen,
2
@fguillen Działa dla mnie w wersji 1.9.3, nie wiem, dlaczego to nie działa dla ciebie.
Michael Dorst,
87
Random.new.rand(a..b)
Gdzie ajest twoja najniższa wartość i bnajwyższa wartość.
Ważną różnicą do zapamiętania jest to, że jeśli po prostu dzwonisz rand(), to dzwonisz Kernel#rand, co obsługuje tylko maxargument. Jeśli chcesz przekroczyć zakres, musisz użyć Random#rand, co oznacza, że musisz wdrożyć w ten sposób. +1
Zobacz tę odpowiedź: jest w Ruby 1.9.2, ale nie we wcześniejszych wersjach. Osobiście uważam, że rand (8) + 3 jest w porządku, ale jeśli jesteś zainteresowany, sprawdź klasę Random opisaną w linku.
Oto szybki punkt odniesienia zarówno dla, jak #samplei dla #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
.rand(3..10)
Odpowiedzi:
AKTUALIZACJA: Ruby 1.9.3
Kernel#rand
akceptuje również zakresyhttp://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
Konwersja na tablicę może być zbyt droga i nie jest konieczna.
Lub
Array # sample
Standard w Ruby 1.8.7+.
Uwaga: w 1.8.7 został nazwany # wybór i w późniejszych wersjach przemianowany.
Ale i tak generowanie macierzy wymaga zasobów, a rozwiązanie, które już napisałeś, jest najlepsze, co możesz zrobić.
źródło
rand(a..b)
nie działa, to dzieli:TypeError: can't convert Range into Integer
. Nie jest nawet obsługiwany w Ruby 2.0Gdzie
a
jest twoja najniższa wartość ib
najwyższa wartość.źródło
rand()
, to dzwoniszKernel#rand
, co obsługuje tylkomax
argument. Jeśli chcesz przekroczyć zakres, musisz użyćRandom#rand
, co oznacza, że musisz wdrożyć w ten sposób. +1Jądro # rand
źródło
Zwróć uwagę na różnicę między operatorami zakresu:
źródło
Zobacz tę odpowiedź: jest w Ruby 1.9.2, ale nie we wcześniejszych wersjach. Osobiście uważam, że rand (8) + 3 jest w porządku, ale jeśli jesteś zainteresowany, sprawdź klasę Random opisaną w linku.
źródło
Dla 10 i 10 ** 24
źródło
rand(10..10**24)
źródło
Oto szybki punkt odniesienia zarówno dla, jak
#sample
i dla#rand
:Więc robienie
rand(a..b)
jest właściwą rzecząźródło