Как получить случайное число в Ruby - PullRequest
763 голосов
/ 13 октября 2008

Как мне сгенерировать случайное число между 0 и n?

Ответы [ 18 ]

934 голосов
/ 13 октября 2008

Использование rand(range)

С Ruby Случайные числа :

Если вам нужно случайное целое число для симуляции броска шестигранного кубика, вы должны использовать: 1 + rand(6). Бросок в кости может быть смоделирован с помощью 2 + rand(6) + rand(6).

Наконец, если вам просто нужно случайное плавание, просто позвоните rand без аргументов.


Как Марк-Андре Лафортун упоминает в его ответ ниже (поднимите его) , Ruby 1.9.2 имеет свой собственный Random класс (что Сам Марк-Андре помог отладить , следовательно, цель 1.9.2 для этой функции).

Например, в этой игре , где вам нужно угадать 10 чисел , вы можете инициализировать их с помощью:

10.times.map{ 20 + Random.rand(11) } 
#=> [26, 26, 22, 20, 30, 26, 23, 23, 25, 22]

Примечание:

Именно поэтому эквивалент Random.new.rand(20..30) будет 20 + Random.rand(11), поскольку Random.rand(int) возвращает «случайное целое число, большее или равное нулю и меньше аргумента ». 20..30 включает 30, мне нужно найти случайное число от 0 до 11, исключая 11.

583 голосов
/ 05 мая 2010

Хотя вы можете использовать rand(42-10) + 10 для получения случайного числа от 10 до 42 (где 10 включительно и 42 исключительно), существует лучший способ, начиная с Ruby 1.9.3, где вы можете вызывать:

rand(10...42) # => 13

Доступно для всех версий Ruby, требуя мой backports драгоценный камень.

Ruby 1.9.2 также представил класс Random, чтобы вы могли создавать свои собственные объекты генератора случайных чисел, и имеет приятный API:

r = Random.new
r.rand(10...42) # => 22
r.bytes(3) # => "rnd"

Сам класс Random действует как генератор случайных чисел, поэтому вы вызываете напрямую:

Random.rand(10...42) # => same as rand(10...42)

Примечания к Random.new

В большинстве случаев проще всего использовать rand или Random.rand. Создание нового генератора случайных чисел каждый раз, когда вам нужно случайное число, является очень плохой идеей . Если вы сделаете это, вы получите случайные свойства начального алгоритма заполнения, которые являются ужасными по сравнению со свойствами самого генератора случайных чисел .

Если вы используете Random.new, вы должны, таким образом, называть его как можно реже , например один раз как MyApp::Random = Random.new, и использовать его повсюду.

Случаи, когда Random.new полезны, следующие:

  • вы пишете гем и не хотите вмешиваться в последовательность rand / Random.rand, на которую основные программы могут полагаться
  • вам нужны отдельные воспроизводимые последовательности случайных чисел (скажем, по одному на поток)
  • вы хотите иметь возможность сохранять и возобновлять воспроизводимую последовательность случайных чисел (просто как Random объекты могут быть распределены)
46 голосов
/ 20 июля 2012

Если вы ищете не только число, но также hex или uuid, стоит упомянуть, что модуль SecureRandom нашел путь от ActiveSupport к ядру ruby ​​в 1.9.2+. Так что без необходимости полноценного каркаса:

require 'securerandom'

p SecureRandom.random_number(100) #=> 15
p SecureRandom.random_number(100) #=> 88

p SecureRandom.random_number #=> 0.596506046187744
p SecureRandom.random_number #=> 0.350621695741409

p SecureRandom.hex #=> "eb693ec8252cd630102fd0d0fb7c3485"

Здесь задокументировано: Ruby 1.9.3 - Модуль: SecureRandom (lib / securerandom.rb)

36 голосов
/ 13 декабря 2012

Вы можете сгенерировать случайное число с помощью метода rand. Аргумент, передаваемый методу rand, должен быть integer или range и возвращать соответствующее случайное число в диапазоне:

rand(9)       # this generates a number between 0 to 8
rand(0 .. 9)  # this generates a number between 0 to 9
rand(1 .. 50) # this generates a number between 1 to 50
#rand(m .. n) # m is the start of the number range, n is the end of number range
21 голосов
/ 13 октября 2008

Ну, я понял это. По-видимому, есть встроенная (?) Функция с именем rand:

rand(n + 1)

Если кто-то ответит более подробным ответом, я отмечу это как правильный ответ.

18 голосов
/ 23 мая 2012

Как насчет этого?

n = 3
(0..n).to_a.sample
12 голосов
/ 19 февраля 2015

Простейший ответ на вопрос:

rand(0..n)
6 голосов
/ 16 ноября 2012
rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

Обратите внимание, что опция диапазона доступна только в более новых версиях ruby ​​(1.9+).

6 голосов
/ 29 апреля 2016

диапазон = 10..50

рандов (диапазон)

или

range.to_a.sample

или

range.to_a.shuffle (это перемешает весь массив, и вы можете выбрать случайное число первым или последним или любым из этого массива, чтобы выбрать случайное)

5 голосов
/ 16 января 2017

Вы можете просто использовать random_number.

Если положительное целое дано как n, random_number возвращает целое число: 0 <= <code>random_number

Используйте это так:

any_number = SecureRandom.random_number(100) 

Вывод будет любым числом от 0 до 100.

...