【发布时间】:2014-09-05 10:56:49
【问题描述】:
以下代码的行为似乎并不直观:
#include <random>
#include <iostream>
using namespace std;
int main()
{
mt19937 MyGenerator(40);
auto gauss = normal_distribution<double>(0,1);
auto linear = uniform_real_distribution<double>(0,1);
cout << gauss(MyGenerator) << endl; //line a
cout << linear(MyGenerator) << endl; //line b
cout << gauss(MyGenerator) << endl;
}
运行此代码给出输出
-0.816097
0.705030
0.303032.
如果现在交换 a 和 b 行的顺序,则输出变为
0.644008
0.338080
-0.639501.
前两个数字现在完全不同了,因为它们是由不同的分布产生的。然而,为什么第三个数字不同? 在我的直觉中,分布应该抓取一个数字 c = MyGenerator() ,然后将其映射到特定范围内的随机数。在分发调用之后,随机数生成器将指向数字序列中的下一个数字。那么,在这两种情况下,第三次调用的结果不应该相同吗?
另一个观察: 实际上,向任一发行版添加第四次调用似乎确实重现了相同的数字。
【问题讨论】: