我有以下代码来初始化一个数组,它起作用:
int main() {
int particle_count = 10000;
MyRNG my_rng = MyRNG(0.0,1.0);
Particle simulation_particles[particle_count];
for (int i = 0; i < particle_count; i++)
{
for (int j = 0; j < 3; j++)
{
simulation_particles[i].assign(j,my_rng.next());
}
}
但是,当我尝试将for循环放在函数中时,所有粒子都设置为相同的值:
void initialize_particle(Particle * p,MyRNG rgen)
{
for (int i = 0; i < 3; i++)
{
float value = rgen.next();
p->assign(i,value);
}
}
void initialize_simulation_particles(int size,Particle * simulation_particles,MyRNG rgen)
{
for (int i = 0; i < size; i++)
{
initialize_particle(&simulation_particles[i],rgen);
}
}
int main() {
int particle_count = 10000;
MyRNG my_rng = MyRNG(0.0,1.0);
Particle simulation_particles[particle_count];
initialize_simulation_particles(particle_count,simulation_particles,my_rng);
答案 0 :(得分:1)
在void initialize_simulation_particles(int size,Particle * simulation_particles, MyRNG rgen)
中,您按值rgen
获取。这意味着您从my_rng
获得了随机生成器main
的副本。由于它是一个伪随机数生成器,它在给定状态下生成相同的数字,并且每次每次生成相同的数字时都将相同的状态复制到该函数。解决方案是使用initialize_simulation_particles
在initialize_particle
和MyRNG &rgen
中通过引用传递它,以便my_rng
的状态进展,从而为每个粒子生成不同的数字。