Terima kasih! Saya pikir saya akan tetap dengan yang lama dan metode yang baik :)
Misha Moroshko
32
Ini adalah ide yang sangat buruk, terutama jika a dan b Anda memiliki ukuran yang tidak diketahui. Coba (100000000000000000..10000000000000000) .to_a.sample dan lihat apa yang saya maksud
:)
4
@ Pixixarth, jika Anda memiliki ide yang lebih baik, yang sesuai dengan pertanyaan, Anda dipersilakan untuk memposting.
Nakilon
rand(a..b)tidak bekerja, itu membagi: TypeError: can't convert Range into Integer. Itu bahkan tidak didukung di Ruby 2.0
fguillen
2
@ fguillen Ini berfungsi untuk saya di 1.9.3, saya tidak tahu mengapa itu tidak berhasil untuk Anda.
Michael Dorst
87
Random.new.rand(a..b)
Di mana anilai terendah Anda dan badalah nilai tertinggi Anda.
Perbedaan penting yang perlu diperhatikan adalah bahwa jika Anda baru saja menelepon, rand()Anda Kernel#randhanya mendukung maxargumen. Jika Anda ingin melewati rentang, Anda harus menggunakan Random#rand, artinya Anda harus menerapkan cara ini. +1
grumpit
2
harus menambahkan bahwa hal di atas berlaku untuk 1.9.2
Lihat jawaban ini : ada di Ruby 1.9.2, tetapi tidak di versi sebelumnya. Secara pribadi saya pikir rand (8) + 3 baik-baik saja, tetapi jika Anda tertarik lihatlah kelas Acak yang dijelaskan dalam tautan.
Dan berikut ini adalah patokan cepat untuk keduanya #sampledan #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
omong-omong.rand(3..10)
Jawaban:
UPDATE: Ruby 1.9.3
Kernel#rand
juga menerima rentanghttp://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
Konversi ke array mungkin terlalu mahal, dan itu tidak perlu.
Atau
Array # sample
Standar dalam Ruby 1.8.7+.
Catatan: diberi nama #choice di 1.8.7 dan diganti namanya di versi yang lebih baru.
Tapi bagaimanapun, menghasilkan sumber daya array perlu, dan solusi yang sudah Anda tulis adalah yang terbaik, yang bisa Anda lakukan.
sumber
rand(a..b)
tidak bekerja, itu membagi:TypeError: can't convert Range into Integer
. Itu bahkan tidak didukung di Ruby 2.0Di mana
a
nilai terendah Anda danb
adalah nilai tertinggi Anda.sumber
rand()
AndaKernel#rand
hanya mendukungmax
argumen. Jika Anda ingin melewati rentang, Anda harus menggunakanRandom#rand
, artinya Anda harus menerapkan cara ini. +1Kernel # rand
sumber
Perhatikan perbedaan antara operator jangkauan:
sumber
Lihat jawaban ini : ada di Ruby 1.9.2, tetapi tidak di versi sebelumnya. Secara pribadi saya pikir rand (8) + 3 baik-baik saja, tetapi jika Anda tertarik lihatlah kelas Acak yang dijelaskan dalam tautan.
sumber
Untuk 10 dan 10 ** 24
sumber
rand(10..10**24)
sumber
Dan berikut ini adalah patokan cepat untuk keduanya
#sample
dan#rand
:Jadi, melakukan
rand(a..b)
adalah hal yang benarsumber