Ответы:
использование rand(range)
Из рубиновых случайных чисел :
Если вам нужно случайное число , чтобы имитировать рулон шестигранного штампа, вы будете использовать:
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
). Только метод экземпляра может принять a Range
, как показано генерацией случайного числа из 7 цифр .
Вот почему эквивалент Random.new.rand(20..30)
будет 20 + Random.rand(11)
, так как Random.rand(int)
возвращает «случайное целое число больше или равно нулю и меньше, чем аргумент ». 20..30
включает в себя 30, мне нужно придумать случайное число от 0 до 11, исключая 11.
Random
класс, но это ужасная идея - звонить Random.new
несколько раз, как в вашем примере. Я отредактировал свой ответ, чтобы заявить, что.
Random.rand
действительно принимает диапазон, на самом деле. (С версии 1.9.3, я считаю.)
Хотя вы можете использовать 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
объекты могут быть упорядочены)backports
жемчужина - это просто набор методов, которые являются новыми для RUby 1.8.7, 1.9.1, 1.9.2, но реализованы в Ruby. Я использую RubySpec, чтобы гарантировать, что результаты совместимы с Ruby.
Random.rand(10..42)
не работает. Метод Random.rand
класса не принимает диапазон. (Ruby 1.9.2p180)
Если вы ищете не только число, но также 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)
SecureRandom.random_number(1000..9999)
SecureRandom.random_number()
не принимает диапазон, так что нет. Вы, вероятно, хотели бы что-то вроде SecureRandom.random_number(10_000)
(для 0-9999) или SecureRandom.random_number(9_000)+1_000
(для 1000-9999).
Вы можете создать случайное число с помощью rand
метода. Аргумент, передаваемый rand
методу, должен быть a integer
или a 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(1..6)
прочтений яснее, чем ответы в топе rand(6)+1
.
Ну, я понял это. Очевидно, есть встроенная (?) Функция с именем rand:
rand(n + 1)
Если кто-то ответит более подробным ответом, я отмечу это как правильный ответ.
Простейший ответ на вопрос:
rand(0..n)
Вы можете просто использовать random_number
.
Если положительное целое число задано как n, random_number
возвращает целое число: 0 <= random_number
<n.
Используйте это так:
any_number = SecureRandom.random_number(100)
Вывод будет любым числом от 0 до 100.
rand(6) #=> gives a random number between 0 and 6 inclusively
rand(1..6) #=> gives a random number between 1 and 6 inclusively
Обратите внимание, что опция range доступна только в более новых (1.9+ версиях) ruby.
ruby 1.9.3+
. Это не сработало, 1.9.2
когда я пытался по крайней мере.
вы можете сделать ранд (диапазон)
x = rand(1..5)
Эта ссылка будет полезна в этом отношении;
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)}
Может быть, это поможет вам. Я использую это в моем приложении
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
Он отлично работает для меня
Как насчет этого?
num = Random.new
num.rand(1..n)
Попробуйте array#shuffle
метод рандомизации
array = (1..10).to_a
array.shuffle.first
.shuffle.first
на .sample
!
srand <some_number>
перед написаниемrand
кода даст вам детерминированную (т.е. повторяемую) псевдослучайную последовательность, если вам это нужно. ruby-doc.org/core-2.5.6/Random.html#method-c-srand