C ++ 11 Zufallszahlenverteilungen sind nicht plattformübergreifend konsistent - welche Alternativen gibt es?

8

Ich suche nach einer Reihe von portablen Distributionen für die Standard-C ++ 11-Engines wie 'std :: mt19937' (siehe Ссылка ).

Die Engine-Implementierungen funktionieren konsistent (d. h. dieselbe Sequenz wird auf verschiedenen Plattformen generiert - getestet mit Clang und MSVC), aber die Distributionen scheinen auf den verschiedenen Plattformen unterschiedlich implementiert zu sein.

Obwohl die Engines die gleiche Sequenz erzeugen, scheint es, dass eine Distribution (zB std::normal_distribution<double> ) nicht die gleiche Anzahl von Samples (dh unterschiedliche Ergebnisse) auf den verschiedenen Plattformen verwendet, was nicht akzeptabel ist in meinem Fall.

Gibt es vielleicht eine Drittanbieter-Lib, die ich benutzen kann, die den zufälligen Templates von C ++ 11 folgt, aber das wird konsistente Werte über populäre Plattformen liefern (Betrachtet Unterstützung über GCC, MSVC und Clang / llvm).

Optionen, die ich bisher angeschaut habe sind:

  • Boost.random (ein bisschen schwer, aber es lohnt sich, da es mit den Gegenstücken von c ++ 11 ziemlich gut übereinstimmt)
  • Klonen von libstd ++ (auch lohnenswert und wahrscheinlich portabel, aber das Abrufen bestimmter Funktionen ist möglicherweise nicht einfach)
  • Eigene C ++ 11-ähnliche Zufallsverteilungen erstellen

Ich brauche Uniform, Normal, Gift und Rayleigh.

    
Arno Duvenhage 20.01.2016, 14:57
quelle

1 Antwort

6

Ich habe meine eigenen C ++ 11-Distributionen erstellt:

%Vor%

Die gleichmäßige Verteilung scheint gute Ergebnisse zu liefern und die Normalverteilung liefert sehr gute Ergebnisse:

100000 Werte - & gt; 68,159% innerhalb 1 Sigma; 95,437% innerhalb von 2 Sigma; 99,747% innerhalb von 3 Sigma

Die Normalverteilung verwendet die Box-Muller-Methode, die nach dem, was ich bisher gelesen habe, nicht die schnellste Methode ist, aber sie läuft mehr schnell genug für meine Anwendung.

Sowohl die Uniform- als auch die Normalverteilung sollten mit jeder C ++ 11-Engine funktionieren (getestet mit std :: mt19937) und liefert die gleiche Sequenz auf allen Plattformen , was genau das ist, was ich wollte.

    
Arno Duvenhage 23.01.2016, 11:36
quelle

Tags und Links