Aşağıdaki kod, [1,100] aralığında beş sözde rastgele sayının bir listesini oluşturmayı amaçlamaktadır. Ben tohuma default_random_engine
ile time(0)
de sistem saatini döndüren Unix zaman . Bu programı Microsoft Visual Studio 2013 kullanarak Windows 7 üzerinde derleyip çalıştırdığımda beklendiği gibi çalışıyor (aşağıya bakın). Ancak bunu g ++ derleyicisiyle Arch Linux'ta yaptığımda, garip davranıyor.
Linux'ta her seferinde 5 numara üretilecektir. Son 4 numara her yürütmede farklı olacaktır (genellikle olduğu gibi), ancak ilk numara aynı kalacaktır.
Windows ve Linux'ta 5 yürütmeden örnek çıktı:
| 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
Gizeme ek olarak, bu ilk sayı Linux'ta periyodik olarak bir artar. Yukarıdaki çıktıları aldıktan sonra yaklaşık 30 dakika bekledim ve 1. sayının değiştiğini ve şimdi hep 26 olarak üretildiğini bulmaya çalıştım. Periyodik olarak 1 artmaya devam etti ve şimdi 32'de. Karşılık geliyor gibi görünüyor. değişen değeri ile time(0)
.
Neden ilk sayı çalıştırmalar arasında nadiren değişiyor ve sonra değiştiğinde 1 artıyor?
Kod. 5 sayıyı ve sistem saatini düzgün bir şekilde yazdırır:
#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)
vssizeof(default_random_engine::result_type)
?