код генератора случайных чисел

Генерация случайных чисел в языке Си

Пожалуйста, приостановите работу AdBlock на этом сайте.

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

Пример: Определение победителя в конкурсе репостов.

Как получить число от игрока, вам уже известно. А вот как заставить компьютер загадать случайное число? В этом уроке вы этому научитесь.

Функция rand().

Давайте посмотрим на эту функцию в действии. Запустим следующий код:

Должно получиться что-то вроде этого.

код генератора случайных чисел. rand. код генератора случайных чисел фото. код генератора случайных чисел-rand. картинка код генератора случайных чисел. картинка rand. Пожалуйста, приостановите работу AdBlock на этом сайте.

Рис.1 Пять случайных чисел, сгенерированных функцийе rand

Ограничить случайные числа сверху.

код генератора случайных чисел. rand do 100. код генератора случайных чисел фото. код генератора случайных чисел-rand do 100. картинка код генератора случайных чисел. картинка rand do 100. Пожалуйста, приостановите работу AdBlock на этом сайте.

Рис.2 Пять случайных чисел меньше 100

Ограничить числа снизу.

Задать границы функции rand сверху и снизу.

Попробуйте запустить эту программу. Удивлены?

Согласно этой формуле перепишем нашу последнюю программу:

код генератора случайных чисел. rand a b. код генератора случайных чисел фото. код генератора случайных чисел-rand a b. картинка код генератора случайных чисел. картинка rand a b. Пожалуйста, приостановите работу AdBlock на этом сайте.

Рис.3 Случайные числа из диапазона [80;100]

Но прежде ещё немного полезной информации. Запустите последнюю программу три раза подряд и записывайте себе случайные числа, которые она генерирует. Заметили?

Функция srand().

Скомпилируйте и запустите несколько раз вот эту программу:

Теперь поменяйте аргумент функции srand() на другое число (надеюсь вы ещё не забыли, что такое аргумент функции?) и снова скомпилируйте и запустите программу. Последовательность чисел должна измениться. Как только мы меняем аргумент в функции srand – меняется и последовательность. Не очень практично, не правда ли? Чтобы изменить последовательность, нужно перекомпилировать программу. Вот бы это число туда подставлялось автоматически.

Практика

Решите предложенные задачи. Для удобства работы сразу переходите в полноэкранный режим код генератора случайных чисел. step full. код генератора случайных чисел фото. код генератора случайных чисел-step full. картинка код генератора случайных чисел. картинка step full. Пожалуйста, приостановите работу AdBlock на этом сайте.

Исследовательские задачи для хакеров:

Источник

Подробно о генераторах случайных и псевдослучайных чисел

Введение

Как отличить случайную последовательность чисел от неслучайной?

Чуть более сложный пример или число Пи

код генератора случайных чисел. 0965ee61c195b3ecccc315b32b5c9847. код генератора случайных чисел фото. код генератора случайных чисел-0965ee61c195b3ecccc315b32b5c9847. картинка код генератора случайных чисел. картинка 0965ee61c195b3ecccc315b32b5c9847. Пожалуйста, приостановите работу AdBlock на этом сайте.
Последовательность цифры в числе Пи считается случайной. Пусть генератор основывается на выводе бит представления числа Пи, начиная с какой-то неизвестной точки. Такой генератор, возможно и пройдет «тест на следующий бит», так как ПИ, видимо, является случайной последовательностью. Однако этот подход не является критографически надежным — если криптоаналитик определит, какой бит числа Пи используется в данный момент, он сможет вычислить и все предшествующие и последующие биты.
Данный пример накладывает ещё одно ограничение на генераторы случайных чисел. Криптоаналитик не должен иметь возможности предсказать работу генератора случайных чисел.

Отличие генератора псевдослучайных чисел (ГПСЧ) от генератора случайных чисел (ГСЧ)

Источники энтропии используются для накопления энтропии с последующим получением из неё начального значения (initial value, seed), необходимого генераторам случайных чисел (ГСЧ) для формирования случайных чисел. ГПСЧ использует единственное начальное значение, откуда и следует его псевдослучайность, а ГСЧ всегда формирует случайное число, имея в начале высококачественную случайную величину, предоставленную различными источниками энтропии.
Энтропия – это мера беспорядка. Информационная энтропия — мера неопределённости или непредсказуемости информации.
Можно сказать, что ГСЧ = ГПСЧ + источник энтропии.

Уязвимости ГПСЧ

Линейный конгруэнтный ГПСЧ (LCPRNG)

Распространённый метод для генерации псевдослучайных чисел, не обладающий криптографической стойкостью. Линейный конгруэнтный метод заключается в вычислении членов линейной рекуррентной последовательности по модулю некоторого натурального числа m, задаваемой следующей формулой:

код генератора случайных чисел. image loader. код генератора случайных чисел фото. код генератора случайных чисел-image loader. картинка код генератора случайных чисел. картинка image loader. Пожалуйста, приостановите работу AdBlock на этом сайте.

где a (multiplier), c (addend), m (mask) — некоторые целочисленные коэффициенты. Получаемая последовательность зависит от выбора стартового числа (seed) X0 и при разных его значениях получаются различные последовательности случайных чисел.

Для выбора коэффициентов имеются свойства позволяющие максимизировать длину периода(максимальная длина равна m), то есть момент, с которого генератор зациклится [1].

Пусть генератор выдал несколько случайных чисел X0, X1, X2, X3. Получается система уравнений

код генератора случайных чисел. image loader. код генератора случайных чисел фото. код генератора случайных чисел-image loader. картинка код генератора случайных чисел. картинка image loader. Пожалуйста, приостановите работу AdBlock на этом сайте.

Решив эту систему, можно определить коэффициенты a, c, m. Как утверждает википедия [8], эта система имеет решение, но решить самостоятельно или найти решение не получилось. Буду очень признателен за любую помощь в этом направлении.

Предсказание результатов линейно-конгруэнтного метода

Основным алгоритмом предсказания чисел для линейно-конгруэнтного метода является Plumstead’s — алгоритм, реализацию, которого можно найти здесь [4](есть онлайн запуск) и здесь [5]. Описание алгоритма можно найти в [9].
Простая реализация конгруэнтного метода на Java.

Отправив 20 чисел на сайт [4], можно с большой вероятностью получить следующие. Чем больше чисел, тем больше вероятность.

Взлом встроенного генератора случайных чисел в Java

Многие языки программирования, например C(rand), C++(rand) и Java используют LСPRNG. Рассмотрим, как можно провести взлом на примере java.utils.Random. Зайдя в исходный код (jdk1.7) данного класса можно увидеть используемые константы

Метод java.utils.Randon.nextInt() выглядит следующим образом (здесь bits == 32)

Результатом является nextseed сдвинутый вправо на 48-32=16 бит. Данный метод называется truncated-bits, особенно неприятен при black-box, приходится добавлять ещё один цикл в brute-force. Взлом будет происходить методом грубой силы(brute-force).

Пусть мы знаем два подряд сгенерированных числа x1 и x2. Тогда необходимо перебрать 2^16 = 65536 вариантов oldseed и применять к x1 формулу:

до тех пор, пока она не станет равной x2. Код для brute-force может выглядеть так

Вывод данной программы будет примерно таким:

Несложно понять, что мы нашли не самый первый seed, а seed, используемый при генерации второго числа. Для нахождения первоначального seed необходимо провести несколько операций, которые Java использовала для преобразования seed, в обратном порядке.

И теперь в исходном коде заменим
crackingSeed.set(seed);
на
crackingSeed.set(getPreviousSeed(seed));

И всё, мы успешно взломали ГПСЧ в Java.

Взлом ГПСЧ Mersenne twister в PHP

Рассмотрим ещё один не криптостойкий алгоритм генерации псевдослучайных чисел Mersenne Twister. Основные преимущества алгоритма — это скорость генерации и огромный период 2^19937 − 1, На этот раз будем анализировать реализацию алгоритма mt_srand() и mt_rand() в исходном коде php версии 5.4.6.

Можно заметить, что php_mt_reload вызывается при инициализации и после вызова php_mt_rand 624 раза. Начнем взлом с конца, обратим трансформации в конце функции php_mt_rand(). Рассмотрим (s1 ^ (s1 >> 18)). В бинарном представление операция выглядит так:

10110111010111100111111001110010 s1
00000000000000000010110111010111100111111001110010 s1 >> 18
10110111010111100101001110100101 s1 ^ (s1 >> 18)
Видно, что первые 18 бит (выделены жирным) остались без изменений.
Напишем две функции для инвертирования битового сдвига и xor

Тогда код для инвертирования последних строк функции php_mt_rand() будет выглядеть так

Если у нас есть 624 последовательных числа сгенерированных Mersenne Twister, то применив этот алгоритм для этих последовательных чисел, мы получим полное состояние Mersenne Twister, и сможем легко определить каждое последующее значение, запустив php_mt_reload для известного набора значений.

Область для взлома

Если вы думаете, что уже нечего ломать, то Вы глубоко заблуждаетесь. Одним из интересных направлений является генератор случайных чисел Adobe Flash(Action Script 3.0). Его особенностью является закрытость исходного кода и отсутствие задания seed’а. Основной интерес к нему, это использование во многих онлайн-казино и онлайн-покере.
Есть много последовательностей чисел, начиная от курса доллара и заканчивая количеством времени проведенным в пробке каждый день. И найти закономерность в таких данных очень не простая задача.

Задание распределения для генератора псевдослучайных чисел

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

Треугольное распределение

Приведем пример генерации случайной величины с треугольным распределением [7] на языке C99.

код генератора случайных чисел. image loader. код генератора случайных чисел фото. код генератора случайных чисел-image loader. картинка код генератора случайных чисел. картинка image loader. Пожалуйста, приостановите работу AdBlock на этом сайте.

Экспоненциальное распределение

Тесты ГПСЧ

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

Одним из известных тестов является тест на следующий бит — тест, служащий для проверки генераторов псевдослучайных чисел на криптостойкость. Тест гласит, что не должно существовать полиномиального алгоритма, который, зная первые k битов случайной последовательности, сможет предсказать k+1 бит с вероятностью большей ½.

В теории криптографии отдельной проблемой является определение того, насколько последовательность чисел или бит, сгенерированных генератором, является случайной. Как правило, для этой цели используются различные статистические тесты, такие как DIEHARD или NIST. Эндрю Яо в 1982 году доказал, что генератор, прошедший «тест на следующий бит», пройдет и любые другие статистические тесты на случайность, выполнимые за полиномиальное время.
В интернете [10] можно пройти тесты DIEHARD и множество других, чтобы определить критостойкость алгоритма.

Источник

Алгоритмы рандома

В этой статье вы увидите самые разнообразные велосипеды алгоритмы для генерации случайных чисел.

Про что статья

C++ rand

Первое что узнаёт начинающий программист С++ по теме получения рандома — функция rand, которая генерирует случайное число в пределах от 0 и RAND_MAX. Константа RAND_MAX описана в файле stdlib.h и равна 32’767, но этом может быть не так, например в Linux (см. коммент). Если же rand() в вашем компиляторе генерирует числа в пределах 32’767 (0x7FFF) и вы хотите получить случайное число большого размера, то код ниже можно рассматривать как вариант решения этой проблемы:

Реализация функции rand в старом C была проста и имела следующий вид:

Данная реализация имела не очень хорошее распределение чисел и ныне в C++ улучшена. Так же стандартная библиотека C++ предлагает дополнительные способы получения случайного числа, о которых ниже.

С++11 STL random

Данный сорт рандома появился в C++11 и представляет из себя следующий набор классов: minstd_rand, mt19937, ranlux, knuth_b и разные их вариации.

Чтобы последовательность случайных чисел не повторялась при каждом запуске программы, задают «зерно» псевдослучайного генератора в виде текущего времени или, в случае с некоторыми ретро (и не только) играми — интервалы между нажатиями клавиш с клавиатуры/джойстика. Библиотека random же предлагает использовать std::random_device для получения зерна лучше чем от time(NULL), однако в случае с компилятором MinGW в Windows функция практически не работает так как надо. До сих пор…

Некоторые из алгоритмов в STL random могут работать быстрее чем rand(), но давать менее качественную последовательность случайных чисел.

PRNG — Pseudo-random Numbers Generator

Можете считать это название — синонимом линейного конгруэнтного метода. PRNG алгоритмы похожи на реализацию rand в C и отличаются лишь константами.

PRNG алгоритмы быстро работают и легки в реализации на многих языках, но не обладают большим периодом.

XorShift

Алгоритм имеющий множество вариаций отличающихся друг от друга периодом и используемыми регистрами. Подробности и разновидности XorShift’а можете посмотреть на Википедии или Хабре. Приведу один из вариантов с последовательностью 2 в 128-й степени.

Данный генератор очень хорош тем, что в нём вообще нет операций деления и умножения — это может быть полезно на процессорах и микроконтроллерах в которых нету ассемблерных инструкций деления/умножения (PIC16, Z80, 6502).

8-bit рандом в эмуляторе z26

Z26 это эмулятор старенькой приставки Atari2600, в коде которого можно обнаружить рандом ориентированный на работу с 1-байтовыми регистрами.

Однажды мне пришлось сделать реализацию этого алгоритма для z80:

Компактный рандом для Z80 от Joe Wingbermuehle

Если вам интересно написание программ под машины с зилогом, то представляю вашему вниманию алгоритм от Joe Wingbermuehle (работает только на зилоге):

Генератор рандома в DOOM

В исходниках игры Дум есть такой интересный файл под названием m_random.c (см. код), в котором описана функция «табличного» рандома, то есть там вообще нет никаких формул и магии с битовыми сдвигами.

Приведу более компактный код наглядно показывающий работу этой функции.

Конечно же это ни какой не рандом и последовательность случайных чисел легко предугадать даже на уровне интуиции в процессе игры, но работает всё это крайне быстро. Если вам не особо важна криптографическая стойкость и вы хотите что-то быстро генерирующее «типа-рандом», то эта функция для вас. Кстати в Quake3 рандом выглядит просто — rand()&0x7FFF.

RDRAND

Некоторые современные процессоры способны генерировать случайные числа с помощью одной ассемблерной команды — RDRAND. Для использования этой функции в C++ вы можете вручную прописать нужные инструкции ассемблерными вставками или же в GCC подключить файл immintrin.h и выбрать любую из вариаций функции _rdrandXX_step, где XX означает число бит в регистре и может быть равно 16, 32 или 64.

Концовка

Класс std::minstd_rand из библиотеки STL random работает быстрее обыкновенного rand() и может стать его альтернативной заменой, если вас не особо волнует длинна периода в minstd. Возможны различия в работе этих функций в Windows и Unix’ах.

Источник

Код генератора случайных чисел

Определяет средства для генерации случайных чисел с равномерным распределением.

Требования

Заголовок:

Пространство имен: std

Библиотека использует инструкцию «#include «.

Итоги

Эти ссылки ведут к основным разделам статьи.

Краткие советы

В большинстве случаев РГСЧ формируют необработанные значения, которые упорядочиваются распределением. (Заметным исключением является то, std::shuffle() что оно напрямую использует ргсч.)

Один экземпляр РГСЧ или распределения не может безопасно вызываться параллельно, так как использование РГСЧ или распределения — это операция изменения. Дополнительные сведения см. в разделе Потоковая безопасность в стандартной библиотеке C++.

Предлагаются предварительно заданные определения типов для нескольких механизмов. Это рекомендуемый способ создания РГСЧ при использовании механизма.

Примеры

В следующем примере кода показана генерация случайных чисел; в этом случае пять из них используют генератор, созданный с недетерминистическим начальным значением.

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

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

Списки по категориям

Равномерные генераторы случайных чисел

РГСЧ часто описываются следующими свойствами.

Длина периода: число итераций до повторения последовательности чисел. Чем период длиннее, тем лучше.

Производительность: сколько времени и памяти требуется для получения чисел. Чем меньше, тем лучше.

Качество: насколько полученная последовательность близка к реальным случайным числам. Часто это называется «стохастичностью«.

Недетерминистический генератор

random_device См
Формирует недетерминистическую, криптографическую безопасную случайную последовательность с помощью внешнего устройства. Обычно используется для получения начального значения для механизма случайных чисел. Низкая производительность, очень высокое качество. Дополнительные сведения см. в разделе Примечания.

Определения типа механизма с предварительно заданными параметрами

Для инициации механизмов и адаптеров. Дополнительные сведения см. в разделе Механизмы и распределения.

default_random_engine Механизм по умолчанию.

knuth_b Механизм Кнута.

minstd_rand0 Минимальный стандартный механизм 1988 (Льюис, Гудмэн и Миллер [Lewis, Goodman, and Miller], 1969).

minstd_rand Обновленный минимальный стандартный механизм minstd_rand0 (Парк, Миллер и Стокмайер [Park, Miller, and Stockmeyer], 1993).

mt19937 32-разрядный механизм типа «Вихрь Мерсенна» (Матсумото и Нишимура [Matsumoto and Nishimura], 1998).

mt19937_64 64-разрядный механизм типа «Вихрь Мерсенна» (Матсумото и Нишимура [Matsumoto and Nishimura], 2000).

ranlux24 24-разрядный механизм RANLUX (Мартин Люшер и Фред Джеймс [Martin Lüscher and Fred James], 1994).

ranlux48 48-разрядный механизм RANLUX (Мартин Люшер и Фред Джеймс [Martin Lüscher and Fred James], 1994).

Шаблоны механизмов

Шаблоны механизмов используются как автономные РГСЧ или как базовые механизмы, которые передаются адаптерам механизмов. Обычно они создаются с предварительно заданным определением типа механизма и передаются в распределение. Дополнительные сведения см. в разделе Механизмы и распределения.

Шаблоны адаптеров механизмов

Адаптеры механизмов — это шаблоны, адаптирующие другие (базовые) механизмы. Обычно они создаются с предварительно заданным определением типа механизма и передаются в распределение. Дополнительные сведения см. в разделе Механизмы и распределения.

ИмяОписание
discard_block_engine СмСоздает случайную последовательность, удаляя значения, возвращенные базовым механизмом.
independent_bits_engine СмСоздает случайную последовательность с указанным числом разрядов, перемешивая разряды из значений, возвращенных базовым механизмом.
shuffle_order_engine СмСоздает случайную последовательность, изменяя порядок значений, возвращенных базовым механизмом.

Распределения случайных чисел

Равномерные распределения

ИмяОписание
uniform_int_distribution СмФормирует равномерное распределение целых чисел в диапазоне, заданном замкнутым интервалом [a, b] (a и b входят в диапазон).
uniform_real_distribution СмФормирует равномерное распределение вещественных чисел (с плавающей запятой) в диапазоне, заданном полузамкнутым интервалом [a, b) (a включено, b не входит в диапазон).
generate_canonicalФормирует равномерное распределение вещественных чисел (с плавающей запятой) с заданной точностью в диапазоне [0, 1) (0 входит в диапазон, 1 не входит).

Распределения Бернулли

ИмяОписание
bernoulli_distribution СмСоздает распределение Бернулли bool значений.
binomial_distribution СмФормирует биномиальное распределение целых значений.
geometric_distribution СмФормирует геометрическое распределение целых значений.
negative_binomial_distribution СмФормирует отрицательное биномиальное распределение целых значений.

Нормальные распределения

ИмяОписание
cauchy_distribution СмФормирует распределение Коши вещественных значений (с плавающей запятой).
chi_squared_distribution СмФормирует распределение хи-квадрат вещественных значений (с плавающей запятой).
fisher_f_distribution СмСоздает F-распределение (также известное как Снедекора F Distribution или распределение Fisher-Snedecor) реальных значений (с плавающей запятой).
lognormal_distribution СмФормирует логарифмически нормальное распределение вещественных значений (с плавающей запятой).
normal_distribution СмФормирует нормальное (Гауссово) распределение вещественных значений (с плавающей запятой).
student_t_distribution СмФормирует t-распределение Стьюдента вещественных значений (с плавающей запятой).

Распределения Пуассона

ИмяОписание
exponential_distribution СмФормирует экспоненциальное распределение вещественных значений (с плавающей запятой).
extreme_value_distribution СмФормирует распределение экстремальных вещественных значений (с плавающей запятой).
gamma_distribution СмФормирует гамма-распределение вещественных значений (с плавающей запятой).
poisson_distribution СмФормирует распределение Пуассона целых значений.
weibull_distribution СмФормирует распределение Вейбулла вещественных значений (с плавающей запятой).

Выборочные распределения

ИмяОписание
discrete_distribution СмФормирует дискретное распределение целых чисел.
piecewise_constant_distribution СмФормирует кусочно-постоянное распределение вещественных значений (с плавающей запятой).
piecewise_linear_distribution СмФормирует кусочно-линейное распределение вещественных значений (с плавающей запятой).

Служебные функции

ИмяОписание
seed_seq СмСоздает шифрованную порождающую последовательность без смещения. Используется для предотвращения повтора потоков случайных чисел. Полезно, если на основе механизмов инициализируется множество РГСЧ.

Операторы

ИмяОписание
operator==Проверка на то, что РГСЧ с левой стороны оператора равен механизму с правой стороны.
operator!=Проверка на то, что РГСЧ с левой стороны оператора не равен механизму с правой стороны.
operatorЗапись сведений о состоянии в поток.
operator>>Извлечение сведений о состоянии из потока.

Механизмы и дистрибутивы

Двигатели

Шаблоны механизмов и шаблоны адаптеров механизмов — это шаблоны, параметры которых настраивают созданный генератор.

Подсистема — это шаблон класса или класса, экземпляры которого (генераторы) выступают в качестве источника случайных чисел, равномерно распределенных между минимальным и максимальным значениями. Адаптер механизма предоставляет последовательность значений с различной стохастичностью, беря значения, сформированные другим механизмом случайных чисел, и применяя к ним определенный алгоритм.

Каждый механизм и адаптер механизма содержат следующие члены.

result_type min() возвращает минимальное значение, полученное от функции operator() генератора. Адаптеры механизма используют результат функции min() базового механизма.

result_type max() возвращает максимальное значение, полученное от функции operator() генератора. Если result_type — это целочисленный тип, то max() — это максимальное значение, которое может быть возвращено (инклюзивное). Если result_type — это вещественное значение, то max() — это наименьшее значение, превышающее все значения, которые могут быть возвращены (неинклюзивное). Адаптеры механизма используют результат функции max() базового механизма.

void discard(unsigned long long count) фактически вызывает operator() count время и отменяет каждое значение.

Адаптеры механизмов также поддерживают следующие члены ( Engine — это первый параметр шаблона адаптера механизма, обозначающий тип базового механизма):

Конструктор по умолчанию, который инициализирует генератор так же, как конструктор базового механизма по умолчанию.

void seed() инициализирует генератор с использованием начального значения базового механизма по умолчанию.

Функция свойства const Engine& base() возвращает базовый механизм, который использовался для создания генератора.

Дистрибутивы

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

template result_type operator()(URNG& gen) возвращает значения, которые распределяются в соответствии с определением распределения, используя gen в качестве источника равномерно распределенных случайных значений и сохраненные параметры распределения.

typedef unspecified-type param_type пакет параметров, которые при необходимости передаются в operator() и используются вместо хранимых параметров для создания возвращаемого значения.

Конструктор const param& инициализирует сохраненные параметры на основе своего аргумента.

param_type param() const получает сохраненные параметры.

void param(const param_type&) задает сохраненные параметры на основе своего аргумента.

result_type min() возвращает минимальное значение, полученное от функции operator() распределения.

result_type max() возвращает максимальное значение, полученное от функции operator() распределения. Если result_type — это целочисленный тип, то max() — это максимальное значение, которое может быть возвращено (инклюзивное). Если result_type — это вещественное значение, то max() — это наименьшее значение, превышающее все значения, которые могут быть возвращены (неинклюзивное).

void reset() удаляет любые кэшированные значения, чтобы результат следующего вызова operator() не зависел от любых значений, полученных от механизма перед вызовом.

Структура параметров — это объект, в котором хранятся все параметры, необходимые для распределения. Она содержит следующие виртуальные машины:

Один или несколько конструкторов, которые принимают такие же наборы параметров, что и конструкторы распределения.

Такие же функции параметров и доступа, как у распределения.

Операторы сравнения равенства и неравенства.

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

Замечания

РГСЧбыстрый;КриптобезопасныйС начальным значениемДетерминированное
mt19937ДаНетДаДа *
random_deviceНетДаНетНет

* Если предоставлено известное начальное значение.

Хотя согласно стандарту ISO для C++ функция random_device не обязана быть криптографически безопасной, в Visual Studio она реализована как криптобезопасная. (Термин «криптографически безопасный» не подразумевает каких-то гарантий, но обозначает минимальный уровень энтропии, а значит, и уровень предсказуемости данного алгоритма рандомизации. Дополнительные сведения см. в статье « криптографически защищенный генератор номеров псевдослучайное» статьи Википедии. Поскольку стандарт ISO C++ не требует этого, другие платформы могут реализовываться random_device как простой генератор случайных чисел (не защищен криптографически) и может быть пригоден только в качестве источника начального значения для другого генератора. При использовании random_device в коде для разных платформ изучите документацию по этим платформам.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *