Следуют ли std::random_device и std::mt19937 равномерному распределению?

Я пытаюсь преобразовать эту строку Matlab в C++: rp = randperm(p);

После randperm документация:

randperm использует тот же генератор случайных чисел, что и rand

И в rand страница:

rand возвращает одно равномерно распределенное случайное число

Так rand следует равномерному распределению. Мой код на C++ основан на:

std::random_device rd;
std::mt19937 g(rd());
std::shuffle(... , ... ,g);

Мой вопрос: приведенный выше код следует равномерное распределение? Если нет, то как это сделать?

1 ответ

Решение

Различные классы из библиотеки случайных чисел C++ примерно работают следующим образом:

  • std::random_device это равномерно распределенный генератор случайных чисел, который может получить доступ к аппаратному устройству в вашей системе, или что-то вроде /dev/random в линуксе Обычно он используется только для генерации псевдослучайного генератора, поскольку базовое устройство обычно быстро исчерпает энтропию.
  • std::mt19937 быстрый генератор псевдослучайных чисел, использующий механизм Мерсенна Твистера, который, согласно названию статьи оригинального автора, также является равномерным. Это генерирует полностью случайные 32-разрядные или 64-разрядные целые числа без знака. поскольку std::random_device используется только для заполнения этого генератора, он не обязательно должен быть равномерным (например, вы часто запускаете генератор, используя текущую временную метку, которая определенно не распределена равномерно).
  • Как правило, вы используете генератор, такой как std::mt19937 кормить конкретное распределение, например std::uniform_int_distribution или же std::normal_distribution которые затем принимают желаемую форму распределения.
  • std::shuffle согласно документации,

    Изменение порядка элементов в указанном диапазоне [first, last) так что каждая возможная перестановка этих элементов имеет равную вероятность появления.

В вашем примере кода вы используете std::mt19937 PRNG кормить std::shuffle, Так, std::mt19937 равномерно, и std::shuffle также должен вести себя равномерно. Итак, все настолько однородно, насколько это возможно.

Другие вопросы по тегам