Ví dụ, để tạo một số ngẫu nhiên từ 3 đến 10, tôi sử dụng: rand(8) + 3
Có cách nào đẹp hơn để làm điều này (một cái gì đó như rand(3, 10)
)?
y - x + 1
nhân tiện.
rand(3..10)
Ví dụ, để tạo một số ngẫu nhiên từ 3 đến 10, tôi sử dụng: rand(8) + 3
Có cách nào đẹp hơn để làm điều này (một cái gì đó như rand(3, 10)
)?
y - x + 1
nhân tiện.
rand(3..10)
Câu trả lời:
CẬP NHẬT: Ruby 1.9.3 Kernel#rand
cũng chấp nhận phạm vi
rand(a..b)
http://www.rubyinside.com/ruby-1-9-3-int sinhtion-and-changes-5428.html
Chuyển đổi sang mảng có thể quá tốn kém và không cần thiết.
(a..b).to_a.sample
Hoặc là
[*a..b].sample
Tiêu chuẩn trong Ruby 1.8.7+.
Lưu ý: được đặt tên #choice trong 1.8.7 và được đổi tên trong các phiên bản sau.
Nhưng dù sao, việc tạo mảng cần tài nguyên và giải pháp bạn đã viết là tốt nhất, bạn có thể làm.
Random.new.rand(a..b)
a
Giá trị thấp nhất của bạn ở đâu và b
là giá trị cao nhất của bạn.
rand()
bạn đang gọi Kernel#rand
, điều này chỉ hỗ trợ một max
đối số. Nếu bạn muốn vượt qua một phạm vi, bạn phải sử dụng Random#rand
, có nghĩa là bạn phải thực hiện theo cách này. +1
rand(3..10)
Khi max là Phạm vi, rand trả về một số ngẫu nhiên trong đó phạm vi.member? (Số) == true.
Chỉ cần lưu ý sự khác biệt giữa các toán tử phạm vi:
3..10 # includes 10
3...10 # doesn't include 10
Và đây là một điểm chuẩn nhanh cho cả hai #sample
và #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)
Vì vậy, làm rand(a..b)
là điều đúng đắn
def my_rand(x, y); rand(y - x) + x; end