Как получить случайное число в Ruby

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

+771
источник поделиться
18 ответов

Используйте rand(range)

Из случайных чисел Ruby:

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

Наконец, если вам просто нужен случайный float, просто вызовите 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.

+939
источник

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

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

Доступно для всех версий Ruby, требуя моего backports gem.

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 могут сортироваться)
+588
источник

Если вы ищете не только число, но и 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)

+46
источник

Вы можете создать случайное число с помощью метода 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
+36
источник

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

rand(n + 1)

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

+21
источник

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

n = 3
(0..n).to_a.sample
+18
источник

Самый простой ответ на вопрос:

rand(0..n)
+12
источник

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

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

Используйте его следующим образом:

any_number = SecureRandom.random_number(100) 

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

+7
источник
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
источник

range = 10..50

Rand (диапазон)

или

range.to_a.sample

или

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

+6
источник

Эта ссылка будет полезной для этого;

http://ruby-doc.org/core-1.9.3/Random.html

И еще немного ясности ниже случайных чисел в рубине;

Создать целое число от 0 до 10

puts (rand() * 10).to_i

Создать число от 0 до 10 В более читаемом виде

puts rand(10)

Создать число от 10 до 15 Включая 15

puts rand(10..15)

Не случайные случайные числа

Сгенерировать одну и ту же последовательность чисел каждый раз программа запускается

srand(5)

Создать 10 случайных чисел

puts (0..10).map{rand(0..10)}
+4
источник

вы можете сделать rand (диапазон)

x = rand(1..5)
+4
источник

Легкий способ получить случайное число в рубине,

def random    
  (1..10).to_a.sample.to_s
end
+3
источник

Попробуйте метод array#shuffle для рандомизации

array = (1..10).to_a
array.shuffle.first
+2
источник

Возможно, это поможет вам. Я использую это в своем приложении

https://github.com/rubyworks/facets
class String

  # Create a random String of given length, using given character set
  #
  # Character set is an Array which can contain Ranges, Arrays, Characters
  #
  # Examples
  #
  #     String.random
  #     => "D9DxFIaqR3dr8Ct1AfmFxHxqGsmA4Oz3"
  #
  #     String.random(10)
  #     => "t8BIna341S"
  #
  #     String.random(10, ['a'..'z'])
  #     => "nstpvixfri"
  #
  #     String.random(10, ['0'..'9'] )
  #     => "0982541042"
  #
  #     String.random(10, ['0'..'9','A'..'F'] )
  #     => "3EBF48AD3D"
  #
  #     BASE64_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", '_', '-']
  #     String.random(10, BASE64_CHAR_SET)
  #     => "xM_1t3qcNn"
  #
  #     SPECIAL_CHARS = ["!", "@", "#", "$", "%", "^", "&", "*", "(", ")", "-", "_", "=", "+", "|", "/", "?", ".", ",", ";", ":", "~", "`", "[", "]", "{", "}", "<", ">"]
  #     BASE91_CHAR_SET =  ["A".."Z", "a".."z", "0".."9", SPECIAL_CHARS]
  #     String.random(10, BASE91_CHAR_SET)
  #      => "S(Z]z,J{v;"
  #
  # CREDIT: Tilo Sloboda
  #
  # SEE: https://gist.github.com/tilo/3ee8d94871d30416feba
  #
  # TODO: Move to random.rb in standard library?

  def self.random(len=32, character_set = ["A".."Z", "a".."z", "0".."9"])
    chars = character_set.map{|x| x.is_a?(Range) ? x.to_a : x }.flatten
    Array.new(len){ chars.sample }.join
  end

end

https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb

Это отлично работает для меня

+2
источник

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

num = Random.new
num.rand(1..n)
+2
источник

Не забудьте сначала засеять RNG с помощью srand().

0
источник

используйте функцию 'rand' Just Like this

rand(10)

0
источник

Посмотрите другие вопросы по меткам или Задайте вопрос