我使用一些随机数作为我的“元启发式优化”计算的初始值。我使用MPI在不同的计算机上运行相同的优化程序。令人惊讶的是,我获得了很多相同的结果。例如,我使用40台主机,结果几乎没有不同的值。几乎6-7个值是相同的。实际上,我的结果可能相似,但它们必须不相同,因为我在程序开头给出了随机数作为首字母(在上面的例子中,我必须得到40个不同的值)。如果我在同一台计算机上重复并顺序运行程序,它会产生不同的结果。
我怀疑这种情况是由随机数生成质量不足引起的。我怎么解决这个问题。我打开其他想法,可能是不同的事情导致这个问题。
P上。 S.我在程序开始时使用srand( (unsigned) time(NULL) )
一次生成随机数字。然后,我使用(float)rand()/32767
我抱怨的结果的一个例子:
15.42161751
19.83328438
3.43446541
23.50453377
23.50453377
3.43446541
19.83328438
23.50453377
3.43446541
7.52127457
7.52127457
23.50453377
7.52127457
7.52127457
23.50453377
19.83328438
19.83328438
19.83328438
7.52127457
15.42161751
3.43446541
19.83328438
19.83328438
15.42161751
23.50453377
23.50453377
5.29145241
19.83328438
19.83328438
19.83328438
19.83328438
7.52127457
23.50453377
3.43446541
19.83328438
23.50453377
7.52127457
3.43446541
7.52127457
5.29145241
答案 0 :(得分:6)
随机数生成器可能正在接收相同的种子值。
我的建议是为计算机,计算机名称或MAC地址创建一个唯一标识符的哈希值,并在时间()返回时创建xor。
答案 1 :(得分:4)
你是对的,C ++中的默认随机数生成器通常质量不高。如果您的编译器已经实现了C ++ 11中的任何一个,那么您可能有更多选择,请参阅此快速参考:http://en.wikipedia.org/wiki/C%2B%2B11#Extensible_random_number_facility。如果您没有这些课程,可以在boost.random中找到它们。
您可能还会考虑真随机数的来源,而不是库中可用的模拟伪随机数,例如Linux上的/dev/random设备文件。
答案 2 :(得分:2)
随机数发生器的质量不是问题。即使是C随机数生成器也不会像你看到的那样产生重复值,除非你使用相同的种子。 函数time具有以秒为单位的分辨率,因此,如果您生成多个进程,则随机数生成器将获得相同的种子,这并不奇怪。你可能想要一个像clock这样的函数,它具有更高的分辨率。
使用时钟作为种子至少还有一个问题:无法从代码中获得两次相同的结果。
答案 3 :(得分:2)
那是因为你的一些主机有相同的时间,所以srand()
需要相同的时间,因此随机序列有相同的起点,所以你当然得到相同的随机数。试着这个:
srand(time(0)*my_computer_id);
答案 4 :(得分:1)
使用比time(NULL)
更精确的内容。我使用static_cast<int64>(clock()) + time(NULL)
。您还可以使用其他熵源,如键盘缓冲区,屏幕缓冲区,内存区域等。取决于您的应用程序所需的随机性质。