Я пытаюсь найти эффективный способ реализовать равномерное (0,1) распределение. Поскольку мне нужно сгенерировать очень большое количество семплов, в качестве движка я выбрал mt19937. Я использую версию из библиотеки boost. Мой вопрос: в чем разница между использованием вывода самого движка и uniform_real_distribution?
Вариант №1
std::random_device rd;
boost::mt19937 gen(rd());
boost::random::uniform_real_distribution<double> urand(0, 1);
for ( int i = 0; i < 1E8; i++ ) {
u = urand(gen);
}
Вариант 2
std::random_device rd;
boost::mt19937 gen(rd());
for ( int i = 0; i < 1E8; i++ ) {
u = (double) gen()/gen.max();
}
Судя по моим тестам, вариант №2 значительно лучше, чем вариант №1, с точки зрения времени выполнения. Есть ли причина, по которой я должен выбрать вариант №1 вместо варианта №2?
uniform_real_distribution
использует больше битов, чтобы гарантировать, что каждый возможный результат с плавающей запятой в диапазоне может быть возвращен. Вариант № 2 будет иметь отверстия, которые1/gen.max()
друг от друга. - person Mark Ransom   schedule 10.12.2014