Arhn - архитектура программирования

В чем разница между использованием std::random_device с pRNG, например. std::mt19937 и без?

В C++11 можно генерировать числа с использованием std::random_device с генератором псевдослучайных чисел, например mt19937, или без него.

В чем будет разница, используя это в этом примерном коде:

#include <random>
#include <iostream>

int main() {
    std::random_device rd;
    std::mt19937 mt(rd());
    std::uniform_real_distribution<double> dist(1, 10);

    for (int i=0; i<16; ++i)
        std::cout << dist(rd) << "\t" << dist(mt) << "\n";
}
16.11.2014


Ответы:


1

Предполагается, что std::random_device даст вам семя для таких двигателей, как mt19937. Качество получаемых последовательных чисел совершенно не определено и может быть недостаточно для практических целей (таких как криптография), поэтому полагаться на это не приходится.

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

16.11.2014

2

Я знаю два отличия:

  1. Использование mt199937 будет быстрее, но менее криптографически безопасно.
  2. std::random_device всегда будет случайным, но если вы инициализируете свой mt19937 постоянным начальным числом, он всегда будет давать вам одни и те же случайные числа:

    std::mt19937 mt(2014);

Каждый раз будет давать одну и ту же последовательность случайных битов. Это может быть полезно, если вы хотите снова и снова тестировать определенное поведение. Стандарт требует этого в 26.5.5/4:

Требуемое поведение: 10000-й последовательный вызов созданного по умолчанию объекта типа mt19937 должен создать значение 4123659995.

Нет такой эквивалентной согласованности с std::random_device.

16.11.2014
  • @KarolyHorvath Да, технически только для конструкции по умолчанию, но это вовсе не требование для random_device, и это единственное, что я вижу для prng ... 16.11.2014
  • и упоминает только одно значение. странный. (примечание: вы имели в виду mt19937). 16.11.2014
  • Я имею в виду - нет требований к тому, что такое nth значение random_device. Принимая во внимание, что, учитывая начальное значение, существует определенная последовательность значений, которую вам даст mt19937. Хотя этого явно нет в стандарте. 16.11.2014
  • Если у вас есть предложение, как лучше сформулировать мой ответ, я полностью за это :) 16.11.2014
  • @ Барри, что ты имеешь в виду, говоря, что std::random_device всегда будет случайным? Гарантировано ли использование внешнего источника случайности, такого как тепловыделение/щелчки мыши/движение и т. д.? Насколько я знаю, стандарт не гарантирует истинной случайности даже для std::random_device. В случае, если система имеет возможность для истинного ранга, она будет использовать его, но в противном случае нет, поправьте меня, если я ошибаюсь. 17.11.2014
  • @vsoftco Вы правы. Стандартные положения (26.5.6/1-2): Генератор random_device однородных случайных чисел производит недетерминированные случайные числа. Если ограничения реализации не позволяют генерировать недетерминированные случайные числа, реализация может использовать механизм случайных чисел. 17.11.2014
  • @ Барри, спасибо, это то, что я вспомнил, и это серьезная проблема в криптографических программах, так как получение истинной случайности - очень сложная проблема. 17.11.2014
  • Я думаю, что под менее криптографически безопасным вы подразумеваете не криптографически безопасный. 17.11.2014
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..