在while循环中调用时,C ++随机数相同

时间:2013-06-13 15:32:43

标签: c++ random while-loop

我正在创建不同长度和方向的向量,并且有一些我无法解释的行为。

我从随机种子开始并声明一个向量:

srand(time(NULL));
std::vector<Particle> psystem;

以下代码然后创建明显的“随机”向量:

float v[3] = {0};
for(int i = 0; i < vectors; ++i) {
    v[0] = float(rand() % 200 - 100) / 3000;
    v[1] = float(rand() % 200 - 100) / 3000;
    v[2] = float(rand() % 200 - 100) / 3000;
    Particle p(0, 0, 0, v[0], v[1], v[2]);
    psystem.push_back(p);
}

添加的while循环会导致 psystem 中的所有元素具有相同的精确值(例如,所有元素都有[0.00345,-0.234,0.00701]):

const float min_length = 0.0174;

float v[3] = {0};
for(int i = 0; i < vectors; ++i) {
    while(sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]) < min_length) {
        v[0] = float(rand() % 200 - 100) / 3000;
        v[1] = float(rand() % 200 - 100) / 3000;
        v[2] = float(rand() % 200 - 100) / 3000;
    }
    Particle p(0, 0, 0, v[0], v[1], v[2]);
    psystem.push_back(p);
}

这种运行速度非常快,所以我不介意它循环一点,直到随机v [0 + 1 + 2]组合满足while条件。但是我在某种程度上杀死了随机分配。我错过了什么?

1 个答案:

答案 0 :(得分:7)

第一次迭代后,数组'v'将保持相同的值。你应该在每个循环中重新初始化它。

float v[3] = {0, 0, 0};
for(int i = 0; i < vectors; ++i) {
    v[0] = 0;
    v[1] = 0;
    v[2] = 0;
    while(sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]) < min_length) {
        v[0] = float(rand() % 200 - 100) / 3000;
        v[1] = float(rand() % 200 - 100) / 3000;
        v[2] = float(rand() % 200 - 100) / 3000;
    }
    Particle p(0, 0, 0, v[0], v[1], v[2]);
    psystem.push_back(p);
}