【发布时间】:2015-09-27 14:27:38
【问题描述】:
有很多类似的问题,但我找不到我的问题的答案。我正在编写自己的随机数生成器(用于学习目的)。我将代码的重要部分粘贴在这里:
long rng(long x0, long c, long p)
{
long x = (c*x0) % p;
return x;
}
在main()函数中,我迭代这个rng()
long x2 = 37951; // initialize the seed
long c = 69069; long p = pow(2,32); // initialize c and p
for (int i=1; i<=n; i++) {
long x1 = rng(x2,c,p);
long x2 = rng(x1,c,p);
cout << x1 << "\t" << x2 <<endl;
}
因为之后我想生成极坐标,我需要在每个循环中生成 2 个随机数。可以看到,种子只初始化了一次,但是我变成的结果是:
2621237619 504678423
2621237619 504678423
2621237619 504678423
2621237619 504678423
2621237619 504678423
如果我只生成 x2(使用 long x2 = rng(x1,c,p);),我会在每个循环中变成不同的结果。谁能告诉我为什么?
【问题讨论】:
-
您将相同的值传递给无状态函数 - 您希望通过什么魔法得出不同的结果?
-
请注意,在循环内部声明的
long x2与在外部声明的long x2不同且无关。后者永远不会更新。 -
将此行
long x2 = rng(x1,c,p);修改为x2 = rng(x1,c,p);,这样您就不会影响种子long x2 -
伪随机生成函数通常有一个种子,初始值由生成函数修改,新值用于下一次调用,再次修改种子下一个电话等等。您的生成函数实际上并没有这个种子值,也没有修改任何内容,因此如果您多次使用相同的参数调用该函数,它将再次创建相同的值。
-
我认为没有理由使用
pow(2, 32)