PRNG mit einstellbarer Periode

Ich muss einen Pseudozufallszahlengenerator mit einer einstellbaren Periode erstellen. Außerdem dürfen innerhalb einer Frist keine Kollisionen auftreten. Das heißt, Folgendes muss true zurückgeben:

// prng is "generated" at run-time
// (though a by-hand solution would work)

bool test(func prng, int period) {
    int seed = 0;  // Any number should work
    int cur = seed;

    for (int i = 0; i <= period; ++i) {
        cur = prng(cur);

        if (cur == seed) {
            if (i == period) {
                // We hit our period on target
                return true;
            }

            // Period too low (we hit our seed already!)
            return false;
        }
    }

    // Period too high
    return false;
}

(Beispiel ist Pseudocode; eine Antwort in einer allgemein lesbaren Sprache (C ++, Python, Haskell usw.) ist akzeptabel.)

Das PRNG mussnich hängt beim Generieren der Zahlen vom veränderlichen statischen Zustand ab. Das heißt, ich kann keine große Tabelle mit bereits zurückgegebenen Nummern oder Ähnlichem haben. Es sollte sich nur auf die angegebene Eingabe stützen, um den nächsten Term zu generieren.

Der Algorithmus muss nicht (natürlich) kryptografisch stark oder "stark" zufällig sein. Jedoch,x % period Das ist nicht akzeptabel; es muss mindestens @ seetwa zufällig

Ich habe mich mit linearen Kongruenzgeneratoren befasst, aber das scheint der falsche Weg zu sein, um meine spezifischen Einschränkungen zu berücksichtigen.

(Brute-Forcing ist keine Option, es sei denn, es ist relativ schnell (ein paar Sekunden).)

Antworten auf die Frage(2)

Ihre Antwort auf die Frage