在Linux中生成相同的数字,但在Windows中生成相同的数字
下面的代码旨在生成间隔为[1,100]的五个伪随机数的列表。我为default_random_engine
with设置了种子time(0)
,它以unix时间返回系统时间。当我使用Microsoft
Visual Studio 2013在Windows 7上编译并运行该程序时,它会按预期运行(请参阅下文)。但是,当我在Arch Linux中使用g
++编译器执行此操作时,它的行为就很奇怪。
在Linux中,每次将生成5个数字。每次执行后4个数字将有所不同(通常是这样),但第一个数字将保持不变。
Windows和Linux上5次执行的示例输出:
| Windows: | Linux: ---------------------------------------
Run 1 | 54,01,91,73,68 | 25,38,40,42,21
Run 2 | 46,24,16,93,82 | 25,78,66,80,81
Run 3 | 86,36,33,63,05 | 25,17,93,17,40
Run 4 | 75,79,66,23,84 | 25,70,95,01,54
Run 5 | 64,36,32,44,85 | 25,09,22,38,13
更令人迷惑的是,在Linux上,第一个数字会定期增加一个。获得上述输出后,我等待了大约30分钟,然后再次尝试发现第一个数字已更改,现在始终生成为26。它一直定期递增1,现在为32。它似乎对应随着价值的变化time(0)
。
编码。它整齐地打印出5个数字和系统时间:
#include <iostream>#include <random>
#include <time.h>
using namespace std;
int main()
{
const int upper_bound = 100;
const int lower_bound = 1;
time_t system_time = time(0);
default_random_engine e(system_time);
uniform_int_distribution<int> u(lower_bound, upper_bound);
cout << '#' << '\t' << "system time" << endl
<< "-------------------" << endl;
for (int counter = 1; counter <= 5; counter++)
{
int secret = u(e);
cout << secret << '\t' << system_time << endl;
}
system("pause");
return 0;
}
回答:
这是怎么回事:
default_random_engine
在libstdc ++(GCC的标准库)中minstd_rand0
,是,这是一个简单的线性同余引擎:typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> minstd_rand0;
该引擎生成随机数的方式是x i + 1 =(16807x i + 0)mod 2147483647。
因此,如果种子相差1,则大多数情况下,第一个生成的数字通常相差16807。
该生成器的范围是[1,2147483646]。libstdc ++
uniform_int_distribution
将其映射到[1,100]范围内的整数的方式本质上是这样的:生成一个numbern
。如果该数字不大于2147483600,则返回(n - 1) / 21474836 + 1
; 否则,请尝试使用新号码。
很容易看出,在大多数情况下,n
在此过程中,两个仅相差16807的s在[1,100]中将产生相同的数字。实际上,人们希望生成的数字大约每21474836/16807
= 1278秒或21.3分钟增加1,这与您的观察非常吻合。
MSVC default_random_engine
是mt19937
,没有这个问题。
以上是 在Linux中生成相同的数字,但在Windows中生成相同的数字 的全部内容, 来源链接: utcz.com/qa/407564.html