我使用一些随机数作为我的“元启发式优化”计算的初始值。我使用MPI在不同的计算机上运行相同的优化程序。令人惊讶的是,我得到了很多相同的结果。例如,我使用40台主机,结果几乎没有不同的值。几乎6-7个值是相同的。实际上,我的结果可以是相似的,但它们一定不能相同,因为我在程序开始时给出了随机数作为它们的首字母(在上面的例子中,我必须得到40个不同的值)。如果我在同一台计算机上重复顺序地运行该程序,它会产生不同的结果。
我怀疑这种情况是由于随机数生成的质量不足造成的。我该如何解决这个问题呢?我打开其他的想法,可能是不同的事情导致了这个问题。
另外,我在程序开始时使用过一次srand( (unsigned) time(NULL) )来生成类似随机的数字。然后,我使用(float)rand()/32767生成0,1范围内的随机数
我抱怨的一个结果的例子:
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发布于 2011-09-22 02:31:00
这是因为你的一些主机有相同的时间,所以srand()需要相同的时间,因此随机序列有相同的起点,所以你当然会得到相同的随机数。试着这样做:
srand(time(0)*my_computer_id);发布于 2011-09-22 02:20:31
随机数生成器可以接收相同的种子值。
我的建议是为计算机、计算机名或MAC地址创建一个唯一标识符的散列,并将其xor到time()的返回值中。
发布于 2011-09-22 02:19:59
您是对的,C++中的默认随机数生成器质量通常不是很高。如果您的编译器实现了任何C++11,您可能会有更多的选择,请参阅快速参考:http://en.wikipedia.org/wiki/C%2B%2B11#Extensible_random_number_facility。如果您没有这些类,可以在boost.random中找到它们。
您还可以考虑真随机数的来源,而不是库中提供的模拟伪随机数,例如Linux上的/dev/random设备文件。
https://stackoverflow.com/questions/7504572
复制相似问题