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

Хотя ни один компьютер не может генерировать действительно случайные числа, Ruby предоставляет доступ к методу, который будет возвращать псевдослучайный номера.

Ни один компьютер не может генерировать по-настоящему случайные числа чисто по расчету. Лучшее, что они могут сделать, - это создать псевдослучайный числа, которые представляют собой последовательность чисел, которые появиться случайно, но это не так.

Для человека-наблюдателя эти числа действительно случайны. Там не будет коротких повторяющихся последовательностей, и, по крайней мере, для человеческого наблюдателя, они не будут представлять четкую картину. Однако, учитывая достаточно времени и мотивации, оригинал семя можно обнаружить, воссоздать последовательность и угадать следующее число в последовательности.

По этой причине методы, обсуждаемые в этой статье, вероятно, не следует использовать для генерации чисел, которые должны быть криптографически безопасными.

Генераторы псевдослучайных чисел должны быть засевали чтобы получить последовательности, которые отличаются каждый раз, когда генерируется новое случайное число. Ни один метод не является волшебным - эти, казалось бы, случайные числа генерируются с использованием относительно простых алгоритмов и относительно простой арифметики. Посеяв PRNG, вы каждый раз запускаете его в разные моменты. Если вы не заполняете его, он будет генерировать одинаковую последовательность чисел каждый раз.

instagram viewer

В рубине Ядро # srand метод может быть вызван без аргументов. Он выберет случайное число на основе времени, идентификатора процесса и порядкового номера. Просто позвонив srand в любом месте в начале вашей программы она будет генерировать разные серии, казалось бы, случайных чисел при каждом запуске. Этот метод вызывается неявно, когда программа запускается, и запускает PRNG с указанием времени и идентификатора процесса (без порядкового номера).

После запуска программы и Ядро # srand был явно или явно вызван, Ядро # рэнд метод может быть вызван. Этот метод, вызываемый без аргументов, вернет случайное число от 0 до 1. В прошлом это число обычно масштабировалось до максимального числа, которое вы хотите сгенерировать, и, возможно, to_i призвал его преобразовать в целое число.

Тем не менее, Ruby делает вещи немного проще, если вы используете Ruby 1.9.x. Ядро # рэнд Метод может принимать один аргумент. Если этот аргумент числовой Ruby будет генерировать целое число от 0 до (и не включая) этого числа.

Однако что делать, если вы хотите сгенерировать число от 10 до 15? Обычно вы генерируете число от 0 до 5 и добавляете его к 10. Тем не менее, Ruby делает это проще.

Убедитесь, что вы обращаете внимание на два типа диапазонов. Если вы позвонили ранд (10..15), что будет генерировать число от 10 до 15 в том числе 15. В то время как ранд (10... 15) (с 3 точками) будет генерировать число от 10 до 15 не включая 15.

Иногда вам нужна случайная последовательность чисел, но вам нужно каждый раз генерировать одну и ту же последовательность. Например, если вы генерируете случайные числа в модульном тесте, вы должны каждый раз генерировать одну и ту же последовательность чисел.

Модульный тест, который не выполняется на одной последовательности, должен снова завершиться неудачей при следующем запуске, если в следующий раз он сгенерирует разностную последовательность, он может не потерпеть неудачу. Для этого позвоните Ядро # srand с известным и постоянным значением.

Реализация Ядро # рэнд скорее не-Ruby. Он никоим образом не абстрагирует PRNG и не позволяет создавать его экземпляры. Существует одно глобальное состояние для PRNG, которое разделяет весь код. Если вы измените начальное значение или иным образом измените состояние PRNG, он может иметь более широкий диапазон действия, чем вы ожидали.

Однако, поскольку программы ожидают, что результат этого метода будет случайным - это его цель! - это, вероятно, никогда не будет проблемой. Только если программа ожидает увидеть ожидаемую последовательность чисел, например, если она srand с постоянным значением, если он увидит неожиданные результаты.

instagram story viewer