Как получить случайное число в 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)
(черезRandom.new
) вообще не было бы хорошей идеей, как подробно объяснил (снова) by Марк-Андре Лафортун, в ответ (снова).но если вы не используете
Random.new
, потом метод классаrand
занимаетmax
значение, а неRange
, as Банистер (энергетически) указывает в комментарии (и как задокументировано в документы наRandom
). Только метод можно взятьRange
, что подтверждается создать случайное число с 7 цифрами.
вот почему эквивалент 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)
Если кто-то ответит более подробным ответом, я отмечу это как правильный ответ.
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)}
возможно, это поможет вам. Я использую это в своем приложении
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
Он отлично работает для меня