Наприклад, щоб генерувати випадкове число між 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)
Відповіді:
ОНОВЛЕННЯ: Ruby 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? (Число) == true.
Просто зауважте різницю між операторами діапазону:
3..10 # includes 10
3...10 # doesn't include 10
А ось швидкий тест для обох #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