我正在创建不同长度和方向的向量,并且有一些我无法解释的行为。
我从随机种子开始并声明一个向量:
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条件。但是我在某种程度上杀死了随机分配。我错过了什么?
答案 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);
}