所以,我试图创建一个随机向量(想想几何,而不是可扩展数组),每次调用随机向量函数时,我都会得到相同的 x 值,尽管 y 和 z 不同。
int main () {
srand ( (unsigned)time(NULL));
Vector<double> a;
a.randvec();
cout << a << endl;
return 0;
}
使用该功能
//random Vector
template <class T>
void Vector<T>::randvec()
{
const int min=-10, max=10;
int randx, randy, randz;
const int bucket_size = RAND_MAX/(max-min);
do randx = (rand()/bucket_size)+min;
while (randx <= min && randx >= max);
x = randx;
do randy = (rand()/bucket_size)+min;
while (randy <= min && randy >= max);
y = randy;
do randz = (rand()/bucket_size)+min;
while (randz <= min && randz >= max);
z = randz;
}
由于某种原因,randx 将始终返回 8,而其他数字似乎完美地遵循(伪)随机性。但是,如果我在 randx 之前调用定义(例如 randy),randy 将始终返回 8。
为什么我的第一个随机数总是 8?难道是我播种方式不对?
问题是随机数生成器使用非常接近的值进行播种 - 程序的每次运行只会少量更改 time() 的返回值 - 可能是 1 秒,甚至可能没有!然后,相当差的标准随机数生成器使用这些相似的种子值来生成明显相同的初始随机数。基本上,您需要一个比 time() 更好的初始种子生成器和一个比 rand() 更好的随机数生成器。
我认为实际使用的循环算法是从 Accelerated C++ 中提取出来的,其目的是在所需范围内产生比使用 mod 运算符更好的数字分布。但它无法弥补总是(有效地)给予相同的种子。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)