以下のコードは、間隔[1,100]の5つの疑似乱数のリストを生成することを目的としています。default_random_engine
with をシードしtime(0)
ます。これは、システム時間をUNIX時間で返します。Microsoft Visual Studio 2013を使用してWindows 7でこのプログラムをコンパイルして実行すると、期待どおりに動作します(以下を参照)。しかし、g ++コンパイラーを備えたArch Linuxでそうすると、奇妙な動作をします。
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では定期的に1ずつ増加します。上記の出力を取得した後、約30分待って、最初の数値が変更され、常に26として生成されていることを再度確認しました。定期的に1ずつ増加し続け、現在は32になっています。の値が変化しますtime(0)
。
最初の数値が実行間でめったに変化しないのはなぜですか?その後、変化すると、1ずつ増加しますか?
コード。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;
}
sizeof(time_t)
対は何sizeof(default_random_engine::result_type)
ですか?