2016-04-05 14 views
3

Ich möchte ein kleines (schnelles) C++ - Programm schreiben, das im Wesentlichen "erkennt", dass der gesamte Zeitraum einer std::minstd_rand0-Engine verbraucht wurde. Mit anderen Worten möchte ich feststellen, wann sich die Sequenz wiederholt (und auch die Zeit messen, die für die Wiederholung der Sequenz benötigt wird). Die Zielverteilung interessiert mich nicht (sie kann einheitlich sein).Wie zu erkennen, dass der gesamte Zeitraum von C++ Random-Engine verbraucht wurde

Irgendwelche Ideen, wie ich vorgehen sollte? Eine Option, die ich in Erwägung zog, ist die Erstellung von zwei Variablen. In der ersten würde ich sagen, dass die 10000 ersten Pseudozufallsvariablen von std:minstd_rand0 zurückgegeben werden. Ich würde dann fortfahren, indem ich die anderen std::array mit aufeinanderfolgenden Blöcken von 10000 Variablen füllte und den Inhalt der 2 Felder nach jedem Durchgang von 10000 Variablen vergleiche. Ich würde denken, dass die gesamte Periode vollzogen wurde, sobald die 2 Arrays gleich sind.

Wäre dieser Ansatz sinnvoll?

+2

Oft wird die genaue Periode des Generators bekannt und in der Dokumentation angegeben, damit Sie dort nachschlagen können. –

+0

Wenn der Zeitraum kein Vielfaches von 10000 ist, gibt Ihr Algorithmus ein Vielfaches des Zeitraums zurück. –

+1

Was versuchst du wirklich? Was ist dein Ziel? –

Antwort

4

Standard-Zufallszahlen-Engines können miteinander verglichen werden - sie vergleichen genau dann, wenn sie denselben Zustand haben.

Daher können Sie ziemlich leicht die Zeit mit Code messen:

  1. Erzeugt zwei Standard aufgebaut Generatoren
  2. Führt eine Schleife eine Reihe von einem der Generatoren zu erzeugen, und eine Zählung erhöht wird.
  3. Bis die beiden Generatoren gleich wieder vergleichen.

Zumindest in meinem kurzen Test von std::minstd_rand0, ich ein Ergebnis von

2147483646 

Unnötig zu sagen bekommen, das ist viel praktischer mit std::minstd_rand0 als mit std::mt19937 (für ein offensichtliches Beispiel).

+0

"raten", das ist der Modul – BigONotation

+0

@BigLudinski: Schließen, aber nein. Der Modulus ist '2147483647' (2^31-1). Ein Teil des Designs des Minimal-Standard-Generators ist, dass es sich um einen Vollperioden-Generator handelt. Das ist also ziemlich genau das, was wir erwarten. –

+0

Mein schlechtes! Und danke für die Lösung :) – BigONotation