Ist die Zufallsbibliothek in C ++ 11 portierbar?

7

Ist die Bibliothek in C ++ 11 portierbar? Ich habe Rand () vermieden, weil ich hörte, dass es nicht tragbar war.

    
Xavier 12.02.2013, 20:09
quelle

3 Antworten

16

Wie definieren Sie "portabel"?

Wenn Sie unter "portabel" meinen, dass "binäre identische Folgen von Zufallszahlen bei gleicher Eingabe erzeugt werden", dann ist rand nicht tragbar. Und ja, die C ++ - Zufallsgeneratoren sind portabel (die meisten von ihnen. Nicht std::default_random_engine oder std::random_device ), weil sie spezifische Algorithmen implementieren. rand darf alles sein, solange es einem Zufallszahlengenerator nicht völlig unähnlich ist.

Davon abgesehen, wie @PeteBecker sagte, sind die Distributionen selbst nicht so gut definiert. Also, während std::mt19937 die gleiche Sequenz von Werten für einen gegebenen Startwert erzeugt, werden andere std::uniform_int_distribution s kann unterschiedliche Werte für die gleiche Eingabesequenz und den gleichen Bereich angeben.

Wenn Sie Konsistenz benötigen, können Sie natürlich immer Ihre eigene Distribution definieren.

    
Nicol Bolas 12.02.2013 20:11
quelle
5

Die in <random> beschriebenen Zufallszahlen-Engines haben explizite Anforderungen an ihre Algorithmen, um die Portabilität sicherzustellen. Die Distributionen nicht.

    
Pete Becker 12.02.2013 20:47
quelle
1

Sie können "identische Folgen von Zufallszahlen bei gleicher Eingabe" (von @Nicol Bolas) mit std generieren: mt19937 (Mersenne Twister) zum Beispiel. Das konnte man definitiv nicht mit rand() machen, was ziemlich nervig war.

Verwandte Fragen:

Ali 12.02.2013 20:50
quelle

Tags und Links