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 + 1
omong-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 + 1
omong-omong.
rand(3..10)
Jawaban:
UPDATE: Ruby 1.9.3 Kernel#rand
juga 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 a
nilai terendah Anda dan b
adalah nilai tertinggi Anda.
rand()
Anda Kernel#rand
hanya mendukung max
argumen. 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 #sample
dan #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