好的,这是一个非常奇怪的结果。不同的rand()序列在表达式中产生相同的结果
我有一个MPI程序,其中每个进程必须在固定范围内生成随机数(范围从文件中读取)。会发生什么情况是即使我为每个进程使用不同的值,并且每个进程中生成的数字都不相同,但生成随机数的表达式仍然会在它们之间产生相同的序列。
这里的所有相关的代码:
// 'rank' will be unique for each process
int rank;
MPI_Comm_rank(MPI_COMM_WORLD, &rank);
// seed the RNG with a different value for each process
srand(time(NULL) + rank);
// print some random numbers to see if we get a unique sequence in each process
// 'log' is a uniquely named file, each process has its own
log << rand() << " " << rand() << " " << rand() << std::endl;
// do boring deterministic stuff
while (true)
{
// waitTimeMin and waitTimeMax are integers, Max is always greater than Min
waitSecs = waitTimeMin + rand() % (waitTimeMax - waitTimeMin);
log << "waiting " << waitSecs << " seconds" << std::endl;
sleep(waitSecs);
// do more boring deterministic stuff
}
这里的每个过程的输出,用3个过程在范围[1,9]产生的数字。
过程1:
15190 28284 3149
waiting 6 seconds
waiting 8 seconds
waiting 9 seconds
waiting 4 seconds
过程2:
286 6264 3153
waiting 6 seconds
waiting 8 seconds
waiting 9 seconds
waiting 4 seconds
过程3:
18151 17013 3156
waiting 6 seconds
waiting 8 seconds
waiting 9 seconds
waiting 4 seconds
因此,尽管rand()
清楚地生成不同的数字,表达式来计算waitSecs
仍评估为所有进程的序列相同。更奇怪的是:如果我再次运行带有相同参数的程序,只有前3个随机数字会改变,其余的“随机”序列在每次运行中将完全相同!更改数字范围显然会产生与此不同的结果,但执行过程中的进程和之间的相同参数始终产生相同的序列:除前3个数字外。
这到底是怎么回事?
编辑:所以只是为了看看它的简单随机生成和/或低的范围内,我取代了随机生成这一行:
waitSecs = waitTimeMin + (int)((double)rand()/((double)RAND_MAX + 1) * (waitTimeMax - waitTimeMin));
而且在范围内开始产生数[1,99]。这里的结果:
过程1:
7833 3798 10977
waiting 1 seconds
waiting 20 seconds
waiting 58 seconds
waiting 35 seconds
waiting 82 seconds
waiting 18 seconds
过程2:
25697 14547 10980
waiting 1 seconds
waiting 20 seconds
waiting 58 seconds
waiting 35 seconds
waiting 82 seconds
waiting 18 seconds
过程3:
10794 25295 10984
waiting 1 seconds
waiting 20 seconds
waiting 58 seconds
waiting 35 seconds
waiting 82 seconds
waiting 18 seconds
同样的事情。这仍然只是rand()
真的很糟糕?
EDIT2:1生成号码10000
检查是否真的是rand()问题: log <<“min”<< waitTimeMin <<“max”<< waitTimeMax << endl; – 2010-04-04 17:43:21
在每种情况下打印您正在播种srand()的值。 – 2010-04-04 18:15:12
做了那个Neil:过程1为X,过程2为X + 1,过程3为X + 2等。 – suszterpatt 2010-04-04 18:22:21