<rastgele> Linux içinde aynı sayı üretir, ama Windows değil
Aşağıdaki kod aralığı içinde pseudo-rastgele beş numaraları listesi [1,100] oluşturmak içindir. Ben unix time sistem saatini verir time(0)
default_random_engine
tohum. Ben ve Windows 7 bu programı Microsoft Visual Studio kullanarak beklendiği gibi (aşağıya bakınız) çalışır 2013, derleme çalıştırın. Kemer g derleyici ile, ancak Linux ben bunu, garip bir şekilde davranır.
, 5 Linux numaraları her zaman oluşturulur. Son 4 numaralar her yürütme farklı olacak sık sık olduğu gibi), ama ilk sayı aynı kalacak.
Windows ve Linux: 5 infaz dan ö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
Gizem ekleyerek, ilk sayı periyodik olarak Linux üzerinde bir artırır. Yukarıdaki çıktıları alındıktan sonra, yaklaşık 30 dakika bekledim ve tekrar 1 numara değişti ve şimdi her zaman bir 26 olarak oluşturulan olduğunu bulmaya çalıştı. 1 tarafından periyodik olarak artırmak için devam etti ve artık 32 yaşında. time(0)
değişen değeri ile karşılık gibi görünüyor.
Neden ilk sayısı nadiren çalışır, ve sonra ne zaman, 1 artım? boyunca aynı kalır
Kod. Bunu düzgünce dışarı 5 numara ve sistem saatini 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;
}
CEVAP
Burada neler var:
Libstdc (KİK standart kitaplığı)
default_random_engine
basit doğrusal congruential altyapısı olanminstd_rand0
,:typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> minstd_rand0;
Bu motoru rasgele sayılar x oluşturur
ben 1= (16807x ben0) mod 2147483647. Eğer tohumlar 1, çoğu zaman o zamana kadar farklıysa bu nedenle, ilk üretilen numarası 16807 göre farklılık gösterecek.
Bu jeneratör aralığı [1, 2147483646]. Yolu '
uniform_int_distribution
aralığında bir tamsayı için haritalar [1, 100] s aslında şu: 12**. Bir sayı üretmek libstdc Eğer sayı 2147483600, sonra dönüş(n - 1) / 21474836 1
; aksi takdirde daha büyük ise, tekrar yeni bir numara ile deneyin.Vakaların büyük çoğunluğunda,
n
sadece 16807 farklı iki bu prosedüre göre aynı sayıda [1, 100] verecek görmek kolay olmalıdır. Aslında, oluşturulan bir sayı gözlemleriniz ile çok iyi kabul eder = 21474836 / 16807 1278 saniye veya her 21.3 dakika, yaklaşık bir artış beklenebilir.
MSVC default_random_engine
Bu sorun yok mt19937
,.
Neden “while(true)” “Parçacığı.olmadan...
Yürütme Dosyaları kilitleme: Windows, ...
.NET Çerçeve: Rastgele sayı üreteci ür...
Bir tam sayı dört milyar verilmiş olan...
Nasıl Ruby rastgele bir sayı almak içi...