Как сгенерировать случайное число между a и b в Ruby? - PullRequest
186 голосов
/ 09 декабря 2010

Например, чтобы сгенерировать случайное число от 3 до 10, я использую: rand(8) + 3

Есть ли лучший способ сделать это (что-то вроде rand(3, 10))?

Ответы [ 8 ]

315 голосов
/ 09 декабря 2010

ОБНОВЛЕНИЕ: 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 и переименован в более поздних версиях.

Но в любом случае для генерации массива нужны ресурсы, а решение, которое вы уже написали, является лучшим, что вы можете сделать.

86 голосов
/ 29 октября 2012
Random.new.rand(a..b) 

Где a - ваше наименьшее значение, а b - наивысшее значение.

12 голосов
/ 16 декабря 2014
rand(3..10)

Kernel # рэнд

Когда max является Range, rand возвращает случайное число, где range.member? (Число) == true.

10 голосов
/ 03 сентября 2015

Просто обратите внимание на разницу между операторами диапазона:

3..10  # includes 10
3...10 # doesn't include 10
3 голосов
/ 23 апреля 2014
def random_int(min, max)
    rand(max - min) + min
end
3 голосов
/ 09 декабря 2010

Для 10 и 10 ** 24

rand(10**24-10)+10
3 голосов
/ 09 декабря 2010

См. этот ответ: есть в Ruby 1.9.2, но не в более ранних версиях. Лично я думаю, что rand (8) + 3 - это хорошо, но если вам интересно, посмотрите класс Random, описанный в ссылке.

2 голосов
/ 02 октября 2017

И вот быстрый тест для #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) - правильная вещь

...