随机数分布是否与平台无关?

时间:2016-11-23 13:11:11

标签: c++11 random language-lawyer

我想知道这样的代码是否会产生每个标准,在所有平台上都会产生相同的结果:

#include <random>

int main() {
  std::mt19937 rng{1};                 // constant seed
  std::bernoulli_distribution distr{}; // default: p(0) = p(1) = 50%
  int total = 0;
  for(int i = 0; i < 100; i++)
    total += distr(rng);
  return total;                        // return value: 47 - or not?
}

我知道均匀随机数生成器需要完全可重复,可以使用已知种子或operator<<内部状态种植它们,并在另一次运行中operator>>种子(无论是另一台机器,用另一个编译器编译等)生成完全相同的伪随机数序列。但发行版同样适用吗?

在G ++中,bernoulli_distribution将使用对rng的单个调用来生成double01之间均匀分布,并将其进行比较到0.5。但是,例如,如果有人重新设计了相等概率的特殊情况,只是从存储的值中提取单个位,并且只在存储的熵达到零时再次调用rng,则会产生不同的结果在一个相同的环境中。

是否符合标准,有这样的发行版的不同实现,或者它是否保证每次查询分发对URNG的调用次数?我当然看到他们允许拥有内部状态,而G ++就是不使用它。但这可能包含在其他目的中。

0 个答案:

没有答案