เพื่อสร้างตัวเลขสุ่มระหว่าง 3 และ 10 ตัวอย่างเช่นฉันใช้: rand(8) + 3
มีวิธีที่ดีกว่าในการทำเช่นนี้rand(3, 10)
หรือไม่?
y - x + 1
โดยวิธีการ
rand(3..10)
เพื่อสร้างตัวเลขสุ่มระหว่าง 3 และ 10 ตัวอย่างเช่นฉันใช้: rand(8) + 3
มีวิธีที่ดีกว่าในการทำเช่นนี้rand(3, 10)
หรือไม่?
y - x + 1
โดยวิธีการ
rand(3..10)
คำตอบ:
ปรับปรุง: ทับทิม 1.9.3 Kernel#rand
ยังยอมรับช่วง
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-introduction-and-changes-5428.html
การแปลงไปเป็นอาร์เรย์อาจมีราคาแพงเกินไปและไม่จำเป็น
(a..b).to_a.sample
หรือ
[*a..b].sample
มาตรฐานใน Ruby 1.8.7+
หมายเหตุ: ชื่อ #choice ใน 1.8.7 และเปลี่ยนชื่อในรุ่นที่ใหม่กว่า
แต่อย่างไรก็ตามการสร้างอาเรย์ต้องการทรัพยากรและวิธีแก้ปัญหาที่คุณเขียนไปนั้นดีที่สุดคุณสามารถทำได้
Random.new.rand(a..b)
a
ค่าต่ำสุดของคุณอยู่ที่ไหนและb
เป็นค่าสูงสุดของคุณ
rand()
คุณกำลังโทรหาKernel#rand
ซึ่งสนับสนุนการmax
โต้แย้งเท่านั้น ถ้าคุณต้องการผ่านช่วงคุณต้องใช้Random#rand
หมายความว่าคุณต้องใช้วิธีนี้ +1
rand(3..10)
เมื่อ max เป็นช่วง rand จะส่งกลับตัวเลขสุ่มโดยที่ range.member? (number) == จริง
เพียงสังเกตความแตกต่างระหว่างตัวดำเนินการช่วง:
3..10 # includes 10
3...10 # doesn't include 10
ดูคำตอบนี้ : มีใน Ruby 1.9.2 แต่ไม่ใช่ในเวอร์ชันก่อนหน้า โดยส่วนตัวฉันคิดว่าแรนด์ (8) +3 ใช้ได้ แต่ถ้าคุณสนใจลองคลาสสุ่มที่อธิบายไว้ในลิงค์
def random_int(min, max)
rand(max - min) + min
end
และนี่คือมาตรฐานที่รวดเร็วสำหรับทั้งสอง#sample
และ#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)
ดังนั้นการทำrand(a..b)
คือสิ่งที่ถูกต้อง
def my_rand(x, y); rand(y - x) + x; end