2010-10-18 19 views
9

Ich habe festgestellt, dass die Standard-Funktion rand() unter Windows und Linux unterschiedliche Ergebnisse gibt. Natürlich habe ich die gleiche Startnummer (1234) verwendet. Hier sind einige erste Ergebnisse:verschiedene Rand() Ergebnisse unter Windows und Linux

WIN: 4068 213 12761 8758

LIN: 479142414 465566339 961126155 1057886067

Meine Anwendung erfordert, dass beide Plattformen identisch Ausgabe. Was sind meine Optionen? Gibt es einen guten Ersatz für rand(), der meine Anforderung erfüllt?

dank

PS. Ich habe MSVC 2008 auf Windows7 und gcc 4.1.2 auf CentOS 5.5

+2

Warum brauchen Sie Zufallszahlen, um plattformübergreifend identisch zu sein? Das ist nicht sehr * zufällig *, was willst du erreichen? –

+0

@EamonNerbonne Mögliches Szenario: App entwickelt unter Linux und Cygwin und getestet mit randomisierten Test. Der Seed wird für jeden Test gedruckt. Wenn der Test eine Fehlerbedingung identifiziert, kann der Fehlerfall mit Hilfe des Seeds reproduziert werden.Wenn man den Fehlerfall auf Linux und Cygwin debuggen möchte, wäre es sehr schön, wenn 'rand' die gleiche zufällige Sequenz unter Linux und Cygwin zurückgeben würde. – Tobias

Antwort

19

Boost hat eine wide range of RNGs, vermutlich mit reproduzierbarem Verhalten über Plattformen hinweg.

+0

Die Boost PRNGs haben alle Referenzen auf den Algorithmus, den sie implementieren, und die gewählten Parameter. Also wird das Verhalten nicht nur reproduzierbar sein, es wird auch mathematisch definiert (d. H. Es gibt einen absoluten Standard für die Korrektheit). – MSalters

4

Sie werden nicht die gleichen Ergebnisse aufgrund der unterschiedlichen Implementierung der Funktionen auf beiden Plattformen erhalten.

7
  • Schreiben Sie Ihre eigenen (nicht empfohlen).
  • Verwenden Sie eine Bibliothek. z.B. Boost
  • This function
+0

Warum "nicht empfohlen"? Eine LCG ist ein triviales Einzeiler, und der Wikipedia-Artikel bietet eine Liste häufig verwendeter Konstanten, die mehr oder weniger gutes Verhalten erzeugen (auf Augenhöhe mit den C-Standardbibliotheksimplementierungen). –

+5

Nicht empfohlen, da die Korrektheit der Implementierung schwer zu testen ist und Fehler nicht sofort erkennbar sind, aber später während der Ausführung der Anwendung zu Problemen führen können. Warum erfinden Sie das Rad neu? –

+0

@Eamon: "Warum erfinden Sie das Rad neu?" Es ist ein frackin ** Einleiner **. Das Herunterladen des Boost-Headers (obwohl dies die erste Lösung wäre, die ich auch empfehlen würde) ist garantiert mehr Arbeit. Und im Allgemeinen stimme ich der Korrektheit zu. Aber noch einmal: Es ist ein One-Liner. Was ich von Wikipedia kopiert habe. Was ist da falsch? –

-4

können Sie versuchen, srand (int), die auf Saatgut (Eingang)

basierte Zufallszahl generiert - Prost

+2

Richtig, aber die Ergebnisse werden nur die gleichen sein, wenn der zugrundeliegende Algorithmus und die Parameter auch gleich sind. –

3

ich glaube, Sie auch verschiedene Linux-Versionen finden Rückgabe verschiedener Werte sowie unterschiedliche Windows-Versionen, die unterschiedliche Werte zurückgeben.

Sie könnten Ihren Zufallsgenerator vereinheitlichen, indem Sie z. B. den glibc-Generator verwenden.

Eine weitere Option für Sie Ihre eigene Funktion ABER tun, dass NUR schreibt wenn Sie 100% sicher, dass Sie Ihre zufällige nicht für Verschlüsselungs Gebrauch verwenden müssen oder jede andere Verwendung, die die Sache Unberechenbarkeit haben erfordert oder Gleichförmigkeit oder sonst zufällige Eigenschaften.

6

Wenn Sie mit dem Standard rand Implementierung zufrieden sind und nur Reproduzierbarkeit benötigen, können Sie ganz einfach Ihre eigene schreiben linear congruential generator (die C-Schnittstelle Anpassung wahrscheinlich keine gute Wahl - eher eine Klasse anstatt!):

namespace myown { 

static int state; 

void srand(int seed) { 
    state = seed; 
} 

int rand() { 
    int const a = 1103515245; 
    int const c = 12345; 
    state = a * state + c; 
    return (state >> 16) & 0x7FFF; 
} 

} 

Dies verwendet Konstanten (ANSI C: Watcom) aus dem Wikipedia-Artikel.

Das heißt, ich würde lieber mit einer Read-made-Implementierung von Boost gehen, wie von anderen vorgeschlagen.

+0

+1 für die richtige Antwort auf die Frage (das OP will Reproduzierbarkeit, nicht eine gute RNG). Denken Sie daran, nach dem Testen einen guten Zufallszahlengenerator zu verwenden> ;-) – smirkingman

Verwandte Themen