有很多类似的问题,但是我找不到我的问题的答案。我正在编写自己的随机数生成器(出于学习目的)。我在这里粘贴代码的重要部分:
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);
),则在每个循环中我将得到不同的结果。有人可以告诉我为什么吗?
这是因为x2
用于计算的x1
数据未更新,因为它被定义为局部变量。
尝试这个:
#include <iostream>
#include <cmath>
using std::cout;
using std::endl;
long rng(long x0, long c, long p)
{
long x = (c*x0) % p;
return x;
}
int main(void) {
long x2 = 37951; // initialize the seed
long c = 69069; long p = pow(2,32); // initialize c and p
int n = 5;
for (int i=1; i<=n; i++) {
long x1 = rng(x2,c,p);
x2 = rng(x1,c,p);
cout << x1 << "\t" << x2 <<endl;
}
return 0;
}
注意:如果的大小long
小于或等于4个字节(32位),则此代码将无法正常工作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句