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

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

17 ответов


использовать rand(range)

С Рубиновые Случайные Числа:

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

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


As Марк-Андре Лафортун упоминает в его ответ ниже (подними голос), 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.


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

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

доступно для всех версий Ruby, требуя my 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 объекты могут упорядочено)

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

это документально здесь: Руби 1.9.3 - модуль: SecureRandom отобрать (Либ/SecureRandom отобрать.rb)


вы можете генерировать случайное число с помощью 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

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

rand(n + 1)

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


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

n = 3
(0..n).to_a.sample

простой ответ на вопрос:

rand(0..n)

rand(6)    #=> gives a random number between 0 and 6 inclusively 
rand(1..6) #=> gives a random number between 1 and 6 inclusively

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


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

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

используйте его так:

any_number = SecureRandom.random_number(100) 

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


эта ссылка будет полезна в этом отношении;

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

и еще немного ясности ниже над случайными числами в Ruby;

создать целое число от 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)}

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

x = rand(1..5)

попробовать array#shuffle метод рандомизации

array = (1..10).to_a
array.shuffle.first

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

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

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


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

num = Random.new
num.rand(1..n)

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

def random    
  (1..10).to_a.sample.to_s
end

Не забудьте засеять ГСЧ с srand() первый.