Ich glaube, dass die alte Schule rand()
Funktion verwendet linear congruential generator.
Diese generator is system dependent. Ein von glibc verwendeter Algorithmus war:
next = next * 1103515245 + 12345;
return next & 0x7fffffff;
so haben Sie Ihre Konstanten. Der Zustand ist natürlich der Anfangswert von "next", der null ist, sofern er nicht anders durch srand()
gesetzt wird.
Es gibt Möglichkeiten, eine lineare Kongruenz anzugreifen; Eine Möglichkeit - die langsamste, aber am einfachsten zu erklären - ist Brute Force es. Sagen Sie, dass Sie vier aufeinanderfolgende Werte haben: a0, a1, a2, a3 von Ihrer rand() Implementierung. Sie können alle Werte von Seed überprüfen, die dieselbe Sequenz ergeben würden.
Beachten Sie, dass, wenn Ihr a0-Wert von, sagen wir, rand()% 7172 produziert wird, dann muss der ursprüngliche Startwert der Regel "seed% 7172 === a0" entsprechen. Dies reduziert sofort den Platz, den Sie für die Brute-Force-Lösung benötigen, und beschleunigt die Operationen entsprechend. Außerdem müssen Sie nicht alle vier Zahlen überprüfen.
Dies würde ich bestimmt
#include <stdio.h>
int main() {
srand(1);
printf("%ld\n", rand());
}
die effizienten äquivalent läuft (in PHP)
for ($seed = 0; $seed < MAX_SEED; $seed++) {
srand($seed);
if ($a0 !== [RAND() FORMULA]) return false;
if ($a1 !== [RAND() FORMULA]) return false;
if ($a2 !== [RAND() FORMULA]) return false;
if ($a3 !== [RAND() FORMULA]) return false;
return true;
}
Experiment
durch Vergleich mit einer Referenz trivial C Quellcode sein, dass PHP und C tatsächlich teilen die gleiche zugrunde liegende Funktion (ich tabellierte verschiedene Werte für srand()).
Ich fand auch heraus, dass srand (0) und srand (1) das gleiche Ergebnis liefern, was nicht mit meinem linearen Modell übereinstimmt.
Und das ist, weil glibc rand() ist nicht so trivial ein linearer kongruenter Generator. Weitere Informationen here.Tatsächlich ist es in einer SO answer zitiert und der Code, den ich hatte, war für den alten Generator TYPE_0.
Ich glaube nicht, dass diese Werte innerhalb eines ausführenden PHP-Skripts zugänglich sind. Warum sollten sie sein? Wie auch immer, die Zufallsfunktion in PHP sollte als eine Black Box gesehen werden, und was in der Welt kann der Punkt der Vorhersage der nächsten Nummer sein? Ich kann wirklich nicht an eins denken. –
Mögliches Duplikat von [Ist es möglich, rand (0,10) in PHP vorherzusagen?] (Http://stackoverflow.com/questions/12729459/is-it-possible-to-predict-rand0-10-in-php)) –
Siehe auch diese Frage zu Softwareengineering @ Stackexchange: https://softwareengineering.stackexchange.com/questions/76229/predicting-the-output-of-phps-rand –