奇怪的相同数字
Strange same numbers
我使用一些随机数作为我的"元启发式优化"计算的初始值。我使用MPI在不同的计算机上运行相同的优化程序。我惊奇地得到了很多相同的结果。例如,我使用40台主机,结果有几个不同的值。几乎6-7个值是相同的。实际上,我的结果可能是相似的,但它们一定不一样,因为我在程序开始时给了随机数字作为首字母(在我上面的例子中,我必须得到40个不同的值)。如果我在同一台计算机上按顺序重复运行该程序,它会产生不同的结果。
我怀疑这种情况是由于随机数生成质量不足造成的。我怎样才能解决这个问题?我打开其他的想法,可能是不同的原因导致这个问题。
p。我在程序的开头使用了一次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
随机数生成器可能接收到相同的种子值。
我的建议是为计算机,计算机名称或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)
。您还可以使用其他熵源,如键盘缓冲区、屏幕缓冲区、内存区域等。这取决于你的应用程序所需要的随机性的质量
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 检查输入是否不是整数或数字
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 如何用数字处理log(0)
- 最高有效数字侧的第N位
- 如何获取一个数字的前3位
- 查找最接近的大于当前数字的数字的索引
- 找到两对数字,使它们的乘积的绝对差最小化
- 我想做一个彼此不同但重复出现的数字
- 将数字转换为字母(例如:123 转换为一二三)
- C++如何计算用户输入的数字中的偶数位数
- 如何在C++中确定文本文件中的元素是字符还是数字
- 打印数字图案
- C++问题:用户认为数字1-100,程序提出问题不超过6次即可得到答案。无法正确
- 如何检查一个c++字符串中有多少相同的字符/数字
- 求出有多少个数字是完美平方,而sqrt()是L,R范围内的素数
- 将数字打印成文字
- 当使用比格式支持的精度更高的精度来显示数字时,会写出什么数据
- 在将数字随机生成为数组期间从内存输出随机数的数组