Der Code ist in Objective C, aber es sollte verständlich sein, wenn Sie es sich ansehen, selbst wenn Sie Objective C nicht kennen. Im Grunde ist es ein RNG-Objekt, Sie instanziieren eine neue Instanz, setzen den Seed, wenn Sie wollen und fangen an zu greifen Zufallszahlen.
Ist es also möglich, eine bestimmte Reihe von Zahlen zurückzuverfolgen, um den Anfangswert für die Generierung der Zahlen zu bestimmen? Ich vermute, dass ein beliebiger Algorithmus keine zufällige Menge von Zahlen erzeugen kann, oder?
Sagen Sie Folgendes:
%Vor% Was mir die Sequenz 10, 10, 8, 10, 2, 10, 9, 9, 7, 4
gibt. Gibt es eine Methode oder einen Algorithmus, den ich verwenden könnte, um die Zahl 1024 zu erhalten? Ich weiß, das ist die gültige Sequenz für die 1024 gesehen, aber was mache ich nur eine Sequenz ... 10, 1, 9, 6, 3, 9, 10, 3, 5, 2
. Gibt es eine Möglichkeit zu wissen, ob das eine gültige Sequenz für diesen Algorithmus ist und wenn ja, was der Seed ist?
RNG.h:
%Vor%RNG.m:
%Vor% Der Code, den Sie posten, ist im Grunde der gleiche wie der openbsd srandom - Es ist ein linearer Kongruenzgenerator, der implementiert wird, um Rundungen zu vermeiden (weshalb er Q
enthält).
hier ist ein Papier, wie man einen solchen Generator knackt , aber es erwartet die volle Ausgabe (nicht die "zwischen" Wert) verfügbar sein.
Ich denke, Sie sollten in der Lage sein, den Ansatz im Papier zu erweitern, um mit "arithmetisch" zu arbeiten, indem Sie den Bereich verwenden (vermutlich würden Sie mehr Proben benötigen).
Am besten ist es wahrscheinlich, ein Array (oder eine Datei) zu erstellen, das den ersten vom angegebenen Algorithmus für jeden Seed zurückgegebenen Wert enthält. Dann kurbeln Sie einfach diejenigen an, die mit dem ersten Wert übereinstimmen, und suchen Sie nach einem längeren Match. In der Tat wäre eine Datenbanktabelle großartig - gdbm oder bsddb oder sqlite kommen mir in den Sinn.
Das klingt für mich wie eines dieser "Es ist berechenbar, aber ..." Probleme. IOW, es kann gemacht werden, aber es ist nicht besonders hübsch.