需要使用C ++ 11进行确定性的均匀分布

时间:2014-09-29 01:19:15

标签: c++11 random distribution deterministic

我使用C ++ 11的随机库来生成确定性随机值,我需要将输出限制到各种范围并自然使用std::uniform_int_distribution但令我感到沮丧的是规范给出了库实现过多的自由度和输出在X86-64 Linux和X86 Windows 7之间有所不同。

除了实现我自己的发行版之外,还有任何选项可以确保输出是否具有确定性而不管库实现?

2 个答案:

答案 0 :(得分:2)

  

除了实现我自己的发行版以外,还有其他选择吗?   无论库实现如何,输出都是确定性的?

除了实现自己的发行版之外,没有其他选择可以确保输出是确定性的,无论库实现如何。虽然引擎是确定性的,但分布不是。

uniform_int_distribution的典型实现将涉及“拒绝”算法,该算法将重复从URNG获取一个数字,如果该结果不在所需范围内,则抛弃它并再试一次。该主题的变化将通过将范围值折叠到范围内值来优化该算法,以便最小化拒绝而不会偏离可接受范围,就像简单的offset + lcg() % range算法那样。

答案 1 :(得分:1)

至少如果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;

请注意,我故意为acm选择了愚蠢的值,所以不要在辩论中采取任何一方来制定一套好的参数