Как создать случайное число между a и b в Ruby?
для генерации случайного числа от 3 до 10, например, я использую: rand(8) + 3
есть ли лучше способ сделать это (что-то вроде rand(3, 10)
)?
8 ответов:
обновление: 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 и переименован позже версии.но в любом случае, для генерации массива нужны ресурсы, и решение, которое вы уже написали, является лучшим, что вы можете сделать.
rand(3..10)
когда max-это диапазон, rand возвращает случайное число, где range.член?(число) == true.
просто обратите внимание на разницу между операторами диапазон:
3..10 # includes 10 3...10 # doesn't include 10
посмотреть этой ответ: есть в Ruby 1.9.2, но не в более ранних версиях. Лично я думаю, что rand(8) + 3 в порядке, но если вам интересно проверить случайный класс, описанный в ссылке.
и вот быстрый тест для обоих
#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)
это правильно