我想知道这样的代码是否会产生每个标准,在所有平台上都会产生相同的结果:
#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
的单个调用来生成double
在0
和1
之间均匀分布,并将其进行比较到0.5
。但是,例如,如果有人重新设计了相等概率的特殊情况,只是从存储的值中提取单个位,并且只在存储的熵达到零时再次调用rng
,则会产生不同的结果在一个相同的环境中。
是否符合标准,有这样的发行版的不同实现,或者它是否保证每次查询分发对URNG的调用次数?我当然看到他们允许拥有内部状态,而G ++就是不使用它。但这可能包含在其他目的中。