奇怪的相同数字

Strange same numbers

本文关键字:数字      更新时间:2023-10-16

我使用一些随机数作为我的"元启发式优化"计算的初始值。我使用MPI在不同的计算机上运行相同的优化程序。我惊奇地得到了很多相同的结果。例如,我使用40台主机,结果有几个不同的值。几乎6-7个值是相同的。实际上,我的结果可能是相似的,但它们一定不一样,因为我在程序开始时给了随机数字作为首字母(在我上面的例子中,我必须得到40个不同的值)。如果我在同一台计算机上按顺序重复运行该程序,它会产生不同的结果。

我怀疑这种情况是由于随机数生成质量不足造成的。我怎样才能解决这个问题?我打开其他的想法,可能是不同的原因导致这个问题。

p。我在程序的开头使用了一次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

随机数生成器可能接收到相同的种子值。

我的建议是为计算机,计算机名称或MAC地址创建一些唯一标识符的哈希,并将其放入time()的返回中。

你是对的,c++中默认的随机数生成器通常质量不是很高。如果您的编译器实现了任何c++ 11,您可能有更多的选择,请参阅这个快速参考:http://en.wikipedia.org/wiki/C%2B%2B11#Extensible_random_number_facility。如果你没有这些类,你可以在boost.random.

中找到它们。

您也可以考虑一个真正随机数的源,而不是从库中获得的模拟伪随机数,例如Linux上的/dev/random设备文件。

这是因为你的一些主机有相同的时间,所以srand()花费相同的时间,因此随机序列有相同的起点,所以当然你得到相同的随机数。试着这样做:

srand(time(0)*my_computer_id);

随机数生成器的质量不是问题。即使是C随机数生成器也不会像您看到的那样产生重复的值,除非您使用相同的种子。函数时间的分辨率以秒为单位,因此,如果生成多个进程,随机数生成器将获得相同的种子,这并不奇怪。你可能想要一个像时钟这样的函数,它有更高的分辨率。

使用时钟作为种子至少还有一个问题:从代码中获得两次相同的结果是不可能的。

使用比time(NULL)更精确的东西。我使用static_cast<int64>(clock()) + time(NULL)。您还可以使用其他熵源,如键盘缓冲区、屏幕缓冲区、内存区域等。这取决于你的应用程序所需要的随机性的质量