Untuk menghasilkan angka acak antara 3 dan 10, misalnya, saya menggunakan: rand(8) + 3
Apakah ada cara yang lebih baik untuk melakukan ini (sesuatu seperti rand(3, 10))?
y - x + 1omong-omong.
rand(3..10)
Untuk menghasilkan angka acak antara 3 dan 10, misalnya, saya menggunakan: rand(8) + 3
Apakah ada cara yang lebih baik untuk melakukan ini (sesuatu seperti rand(3, 10))?
y - x + 1omong-omong.
rand(3..10)
Jawaban:
UPDATE: Ruby 1.9.3 Kernel#randjuga menerima rentang
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
Konversi ke array mungkin terlalu mahal, dan itu tidak perlu.
(a..b).to_a.sample
Atau
[*a..b].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.
Random.new.rand(a..b)
Di mana anilai terendah Anda dan badalah nilai tertinggi Anda.
rand()Anda Kernel#randhanya mendukung maxargumen. Jika Anda ingin melewati rentang, Anda harus menggunakan Random#rand, artinya Anda harus menerapkan cara ini. +1
rand(3..10)
Ketika maks adalah Range, rand mengembalikan angka acak di mana range.member? (Number) == true.
Perhatikan perbedaan antara operator jangkauan:
3..10 # includes 10
3...10 # doesn't include 10
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.870000 0.020000 3.890000 ( 3.888147)
rand 0.150000 0.000000 0.150000 ( 0.153557)
Jadi, melakukan rand(a..b)adalah hal yang benar
def my_rand(x, y); rand(y - x) + x; end