首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >奇怪的相同数字

奇怪的相同数字
EN

Stack Overflow用户
提问于 2011-09-22 02:11:51
回答 5查看 179关注 0票数 0

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

我怀疑这种情况是由于随机数生成的质量不足造成的。我该如何解决这个问题呢?我打开其他的想法,可能是不同的事情导致了这个问题。

另外,我在程序开始时使用过一次srand( (unsigned) time(NULL) )来生成类似随机的数字。然后,我使用(float)rand()/32767生成0,1范围内的随机数

我抱怨的一个结果的例子:

代码语言:javascript
复制
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
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-09-22 02:31:00

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

代码语言:javascript
复制
srand(time(0)*my_computer_id);
票数 2
EN

Stack Overflow用户

发布于 2011-09-22 02:20:31

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

我的建议是为计算机、计算机名或MAC地址创建一个唯一标识符的散列,并将其xor到time()的返回值中。

票数 6
EN

Stack Overflow用户

发布于 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设备文件。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7504572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档