2016-07-14 35 views
1

Я пытаюсь преобразовать эту строку MATLAB в C++: rp = randperm(p);Сделайте std :: random_device и std :: mt19937 следуйте равномерному распределению?

Вслед за randpermdocumentation:

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

И в randpage :

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

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

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

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

+0

['std :: uniform_int_distribution'] (http://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution#Example) – BoBTFish

+0

По крайней мере,' std :: mt19937' должно быть однородным, [если вы доверяйте титулу авторов оригинала] (https://dx.doi.org/10.1145%2F272991.272995). И 'std :: random_device' просто используется для семян Mersenne Twister, поэтому на самом деле это не должно быть равномерным. – mindriot

+0

@mindriot благодарит за ваш ответ.Чем отличается разница по сравнению с 'std :: uniform_int_distribution', описанная выше? – justHelloWorld

ответ

5

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

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

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

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

Смежные вопросы