Na przykład, aby wygenerować losową liczbę od 3 do 10, używam: rand(8) + 3
Czy jest na to lepszy sposób (coś takiego rand(3, 10)
)?
y - x + 1
.
rand(3..10)
Na przykład, aby wygenerować losową liczbę od 3 do 10, używam: rand(8) + 3
Czy jest na to lepszy sposób (coś takiego rand(3, 10)
)?
y - x + 1
.
rand(3..10)
Odpowiedzi:
AKTUALIZACJA: Ruby 1.9.3 Kernel#rand
akceptuje również zakresy
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
Konwersja na tablicę może być zbyt droga i nie jest konieczna.
(a..b).to_a.sample
Lub
[*a..b].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ć.
Random.new.rand(a..b)
Gdzie a
jest twoja najniższa wartość i b
najwyższa wartość.
rand()
, to dzwonisz Kernel#rand
, co obsługuje tylko max
argument. Jeśli chcesz przekroczyć zakres, musisz użyć Random#rand
, co oznacza, że musisz wdrożyć w ten sposób. +1
rand(3..10)
Gdy maks. To Zakres, rand zwraca losową liczbę, gdzie range.member? (Liczba) == true.
Zwróć uwagę na różnicę między operatorami zakresu:
3..10 # includes 10
3...10 # doesn't include 10
Oto szybki punkt odniesienia zarówno dla, jak #sample
i 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.870000 0.020000 3.890000 ( 3.888147)
rand 0.150000 0.000000 0.150000 ( 0.153557)
Więc robienie rand(a..b)
jest właściwą rzeczą
def my_rand(x, y); rand(y - x) + x; end