我在cppreference's article for std::mersenne_twister_engine
上注意到以下内容(例如std::mt19937
):
需要第1000次连续调用默认构造的
std::mt19937
才能生成值4123659995
。需要第1000次连续调用默认构造的
std::mt19937_64
才能生成值9981545732273789042
。
假设对标准的这种解释是准确的,那么交易是什么?为什么存在这些保证?这不是非随机的吗?
根据提案,N1398:
用户如何确信随机数引擎的实现完全符合规定,正确考虑任何平台特性[原文如此](例如,奇数大小的整数)?毕竟,实施中的小错字可能并不明显;产生的数字可能看起来“随机”。因此,该提议为每个引擎指定了默认构造的引擎对象产生的随机数序列中的第10000个数字。
所以它只是一个相对随意的“航路点”,被选为确保实施符合PRNG语义的一种方式。
它本身并不是语义约束;这是一个验证,实施遵守要求。
IMO在标准文本中的注释可能是有序的,因为这是一种前所未有的方式来仔细检查实施的质量。 (我不知道任何其他功能,其实现的QoI可以通过标准文本本身给出的样本数据进行验证。)
所有技术上有用的随机数发生器都是伪随机发生器(wikipedia)的设计。这意味着它们具有种子,并且基于给定的种子产生100%相同的序列。这是蒙特卡罗模拟等应用的关键要求,在这些模拟中,您可能会遇到罕见的问题或错误,如果没有此功能,则无法开发任何稳定的复杂蒙特卡罗模拟序列。
所以随机数不会产生随机数。它们产生的数字序列在任何或非常长的距离上都具有零相关性。
在您的示例中,默认初始化仅对应于此类序列中的一个特定序列。