C++11 需要使用C++;11

C++11 需要使用C++;11,c++11,random,distribution,deterministic,C++11,Random,Distribution,Deterministic,我使用C++11的随机库来生成确定性随机值,我需要将输出限制在不同的范围内,并自然使用std::uniform_int_distribution,但令我失望的是,该规范给了库实现太多的自由度,并且输出在X86-64 Linux和X86 Windows 7之间存在差异 除了实现我自己的发行版之外,是否还有其他选项可以确保输出是确定性的,而不管库实现如何?至少如果LCG足以满足您的需要,那么应用程序提供的带有一些固定常量的实例化应该会产生确定性输出 typedef uint64_t number;

我使用C++11的随机库来生成确定性随机值,我需要将输出限制在不同的范围内,并自然使用
std::uniform_int_distribution
,但令我失望的是,该规范给了库实现太多的自由度,并且输出在X86-64 Linux和X86 Windows 7之间存在差异


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

至少如果LCG足以满足您的需要,那么应用程序提供的带有一些固定常量的实例化应该会产生确定性输出

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;
typedef uint64\u t编号;
constexpr数a{1};
constexpr数c{2};
constexpr数m{3};
constexpr数种子{0};
线性同余引擎lcg{seed};
标准:均匀分布区{0,1000};
对于(int i=0;i<10;++i)
标准::cout
除了实施我自己的分发之外,还有什么其他选择来确保
无论库实现如何,输出都是确定性的

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


uniform\u int\u distribution
的典型实现将涉及“拒绝”算法,该算法将重复从URNG获取一个数字,如果该结果不在所需范围内,则将其丢弃并重试。该主题的变化将通过将范围外的值折叠为范围内的值来优化该算法,从而在不影响接受范围的情况下最小化拒绝,如过于简单的
offset+lcg()%range
算法可以。

您使用的是哪种randon数字引擎?@jbgs我已经测试了各种随机引擎的输出,它们确实可以在各种STL实现中工作。LCG是我测试过的引擎之一,PRNG本身不是问题所在,分布是我得到不同输出的地方。哦,好的。在这种情况下,可能最容易使用
offset+lcg()%range
。幸运的是你只想要均匀的整数分布。谢谢你的评论,这就是我要说的。在这一点上,我主要关心的是引入偏见,但嘿,它现在应该工作得足够好,并且在以后的日期替换它是微不足道的。