Как мне сгенерировать случайное число между 0
и n
?
ruby-on-rails
ruby
ruby-on-rails-3
ruby-on-rails-4
random
Марк А. Николози
источник
источник
srand <some_number>
перед написаниемrand
кода даст вам детерминированную (т.е. повторяемую) псевдослучайную последовательность, если вам это нужно. ruby-doc.org/core-2.5.6/Random.html#method-c-srandОтветы:
использование
rand(range)
Из рубиновых случайных чисел :
Как отмечает Марк-Андре Лафортун в своем ответе ниже (см. Выше) , Ruby 1.9.2 имеет свой собственный
Random
класс (который сам Марк-Андре помогал отлаживать , отсюда цель 1.9.2 для этой функции).Например, в этой игре, где вам нужно угадать 10 чисел , вы можете инициализировать их с помощью:
Замечания:
Использование
Random.new.rand(20..30)
(использованиеRandom.new
), как правило, не было бы хорошей идеей, как было подробно объяснено (снова) Марком-Андре Лафортуном в его ответе (снова).Но если вы не используете
Random.new
, то метод классаrand
принимает толькоmax
значение, а неRange
, как и перил (энергично) указывает в комментарии (и как описано в документации дляRandom
). Только метод экземпляра может принять aRange
, как показано генерацией случайного числа из 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, где вы можете позвонить:Доступно для всех версий Ruby, требуя мой
backports
драгоценный камень.Ruby 1.9.2 также представил
Random
класс, чтобы вы могли создавать свои собственные объекты генератора случайных чисел и имеет хороший API:Сам
Random
класс действует как генератор случайных чисел, поэтому вы вызываете напрямую:Примечания о
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+. Так что без необходимости полноценного каркаса:Это задокументировано здесь: 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
методу, должен быть ainteger
или arange
и возвращать соответствующее случайное число в диапазоне:источник
rand(1..6)
прочтений яснее, чем ответы в топеrand(6)+1
.Ну, я понял это. Очевидно, есть встроенная (?) Функция с именем rand:
Если кто-то ответит более подробным ответом, я отмечу это как правильный ответ.
источник
Что насчет этого?
источник
rand
как O (1).Простейший ответ на вопрос:
источник
Вы можете просто использовать
random_number
.Если положительное целое число задано как n,
random_number
возвращает целое число: 0 <=random_number
<n.Используйте это так:
Вывод будет любым числом от 0 до 100.
источник
Обратите внимание, что опция range доступна только в более новых (1.9+ версиях) ruby.
источник
ruby 1.9.3+
. Это не сработало,1.9.2
когда я пытался по крайней мере.диапазон = 10..50
Rand (диапазон)
или
range.to_a.sample
или
range.to_a.shuffle (это перетасует весь массив, и вы можете выбрать случайное число первым или последним или любым из этого массива, чтобы выбрать случайное)
источник
range.to_a.sample
ужасная идея, когда образец большой.вы можете сделать ранд (диапазон)
источник
Эта ссылка будет полезна в этом отношении;
http://ruby-doc.org/core-1.9.3/Random.html
И еще немного ясности по поводу случайных чисел в рубине;
Генерация целого числа от 0 до 10
Генерация числа от 0 до 10 в более читабельном виде
Генерация числа от 10 до 15, в том числе 15
Неслучайные случайные числа
Генерация одинаковой последовательности чисел при каждом запуске программы
Генерация 10 случайных чисел
источник
Простой способ получить случайное число в рубине,
источник
Может быть, это поможет вам. Я использую это в моем приложении
https://github.com/rubyworks/facets/blob/5569b03b4c6fd25897444a266ffe25872284be2b/lib/core/facets/string/random.rb
Он отлично работает для меня
источник
Как насчет этого?
источник
Попробуйте
array#shuffle
метод рандомизацииисточник
.shuffle.first
на.sample
!Не забудьте сначала посеять ГСЧ с помощью srand () .
источник