Следуют ли 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);

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

2

Решение

Различные классы из 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 также должен вести себя равномерно. Итак, все настолько однородно, насколько это возможно.

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]