Нуждается в детерминированном равномерном распределении с использованием C++11

Я использую случайную библиотеку C++11 для получения детерминированных случайных значений, мне нужно ограничить вывод различными диапазонами и, естественно, использовать std::uniform_int_distribution но, к моему большому разочарованию, спецификация дает библиотекам слишком большую свободу, и выходные данные отличаются, например, между X86-64 Linux и X86 Windows 7.

Есть ли какая-либо опция помимо реализации моего собственного дистрибутива, чтобы гарантировать, что вывод является детерминированным независимо от реализации библиотеки?

2 ответа

Решение

Есть ли какая-либо опция помимо реализации моего собственного дистрибутива, чтобы гарантировать, что вывод является детерминированным независимо от реализации библиотеки?

Кроме реализации собственного дистрибутива, нет никакой возможности гарантировать, что вывод будет детерминированным независимо от реализации библиотеки. Хотя двигатели являются детерминированными, распределения - нет.

Типичные реализации для uniform_int_distribution будет включать алгоритмы "отклонения", которые будут неоднократно получать число от URNG, и если этот результат не находится в желаемом диапазоне, отбросьте его и попробуйте снова. Вариации на эту тему оптимизируют этот алгоритм путем свертывания значений диапазона в значения в диапазоне, чтобы минимизировать отклонения без смещения диапазона приема, как упрощенный offset + lcg() % range алгоритм делает.

По крайней мере, если LCG достаточно хорош для вашей цели, std::linear_congruential_engine Создание экземпляра с некоторыми фиксированными константами, предоставляемыми вашим приложением, должно давать детерминированный вывод.

typedef uint64_t number;
constexpr number a {1};
constexpr number c {2};
constexpr number m {3};
constexpr number seed {0};
std::linear_congruential_engine<number, a, c, m> lcg {seed};
std::uniform_int_distribution<number> dist {0, 1000};
for (int i = 0; i < 10; ++i)
  std::cout << dist(lcg) << std::endl;

Обратите внимание, что я специально выбрал глупые значения для a, c а также m поэтому не стоит принимать какую-либо сторону в дискуссии о том, что могло бы стать хорошим набором параметров.

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