【发布时间】:2019-02-25 23:32:43
【问题描述】:
我在cppreference's article for std::mersenne_twister_engine 上注意到以下内容(例如std::mt19937):
需要连续第 10000 次调用默认构造的
std::mt19937才能生成值4123659995。需要连续第 10000 次调用默认构造的
std::mt19937_64才能生成值9981545732273789042。
假设对标准的这种解释是准确的,那么问题是什么?为什么存在这些保证?这不是非随机吗?
【问题讨论】:
-
这些是确定性伪随机数生成器。如果没有适当的随机种子,它们不就是这样吗?使用actually random number 播种会产生不可预测的输出。
-
mersenne_twister 根据定义是非随机的。它是一个 PRNG,我认为要求是强制 MT 进行正确的实现。
-
为了可重现,这在某些领域是必需的。
-
可悲的是,对于大多数任务,再现性超出了窗口,因为标准没有为
std::uniform_int_distribution做出类似的保证。因此,在实际环境中,不同的平台会产生不同的结果:( -
@LightnessRacesinOrbit 目前我发现的唯一参考文献是 wg21 论文 N1398。它对 10,000 和几个随机引擎的特定值有一些基本原理。