Например, чтобы сгенерировать случайное число от 3 до 10, я использую: rand(8) + 3
Есть ли способ сделать это лучше (что-то вроде 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+.
Примечание: в 1.8.7 был назван #choice, а в более поздних версиях был переименован.
Но в любом случае для создания массива требуются ресурсы, и решение, которое вы уже написали, является лучшим, что вы можете сделать.
Random.new.rand(a..b)
Где a
ваша самая низкая ценность и b
ваша самая высокая ценность.
rand()
вы звоните Kernel#rand
, что поддерживает только max
аргумент. Если вы хотите передать диапазон, вы должны использовать Random#rand
, что означает, что вы должны реализовать этот способ. +1
rand(3..10)
Когда max является Range, rand возвращает случайное число, где range.member? (Number) == 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