ruby-on-rails - пример - securerandom ruby
Как получить случайное число в Ruby (12)
Вы можете просто использовать random_number
.
Если положительное целое число задано как n, random_number
возвращает целое число: 0 <= random_number
<n.
Используйте его так:
any_number = SecureRandom.random_number(100)
На выходе будет любое число от 0 до 100.
Как создать случайное число между 0
и n
?
Вы можете создать случайное число с помощью метода 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(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)
(с использованиемRandom.new
) обычно не было бы хорошей идеей, как подробно объяснил (снова) Марк-Андре Лафортун в своем ответе (снова).Но если вы не используете
Random.new
, то метод классаrand
принимает толькоmax
значение, а неRange
, поскольку в комментарии (а также как указано в документах дляRandom
) указывается в качестве banister (энергетически). Только метод экземпляра может приниматьRange
, как показано, генерируя случайное число с 7 цифрами .
Вот почему эквивалент Random.new.rand(20..30)
будет равен 20 + Random.rand(11)
, так как Random.rand(int)
возвращает «случайное целое число, большее или равное нулю, и меньше, чем аргумент . » 20..30
включает 30, мне нужно найти случайное число от 0 до 11, исключая 11.
Как насчет этого?
n = 3
(0..n).to_a.sample
Легкий способ получить случайное число в рубине,
def random
(1..10).to_a.sample.to_s
end
Может быть, это поможет вам. Я использую это в своем приложении
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
Он отлично работает для меня
Ну, я понял это. По-видимому, существует встроенная (?) Функция, называемая rand:
rand(n + 1)
Если кто-то ответит более подробным ответом, я буду отмечать это как правильный ответ.
Попробуйте метод array#shuffle
для рандомизации
array = (1..10).to_a
array.shuffle.first
Хотя вы можете использовать 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
когда Random.new
полезно, являются следующие:
- вы пишете драгоценный камень и не хотите вмешиваться в последовательность
rand
/Random.rand
что основные программы могут полагаться на - вам нужны отдельные воспроизводимые последовательности случайных чисел (скажем, по одному на поток)
- вы хотите сохранить и возобновить воспроизводимую последовательность случайных чисел (легко, как
Random
объекты могут сортироваться)
Эта ссылка будет полезной в этом отношении;
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)}
диапазон = 10..50
Rand (диапазон)
или же
range.to_a.sample
или же
range.to_a.shuffle (это будет перемешать весь массив, и вы можете выбрать случайное число первым или последним или любым из этого массива, чтобы выбрать случайный)
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+).