SORU
23 EYLÜL 2015, ÇARŞAMBA


<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
23 EYLÜL 2015, ÇARŞAMBA


Burada neler var:

  • Libstdc (KİK standart kitaplığı) default_random_engine basit doğrusal congruential altyapısı olan minstd_rand0,:

    typedef linear_congruential_engine<uint_fast32_t, 16807, 0, 2147483647> minstd_rand0;
    
  • Bu motoru rasgele sayılar x oluştururben 1= (16807xben0) 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, nsadece 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,.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Matt Harding

    Matt Harding

    23 Mayıs 2006
  • MyCyberAcademy

    MyCyberAcade

    2 EKİM 2011
  • SegaAmerica

    SegaAmerica

    5 Mart 2008