it-swarm.dev

Warum ist es unmöglich, wirklich Zufallszahlen zu erzeugen?

Ich habe versucht, ein Hobbyproblem zu lösen, bei dem eine Million Zufallszahlen generiert werden mussten. Aber mir wurde schnell klar, dass es schwierig wird, sie einzigartig zu machen. Ich habe Algorithm Design Manual aufgegriffen, um über die Zufallszahlengenerierung zu lesen.

Es hat den folgenden Absatz, den ich überhaupt nicht verstehen kann.

Leider sieht das Generieren von Zufallszahlen viel einfacher aus als es wirklich ist. In der Tat ist es grundsätzlich unmöglich, auf einem deterministischen Gerät wirklich zufällige Zahlen zu erzeugen. Von Neumann [Neu63] sagte es am besten: "Wer arithmetische Methoden zur Erzeugung zufälliger Ziffern in Betracht zieht, befindet sich natürlich in einem Zustand der Sünde." Das Beste, auf das wir hoffen können, sind Pseudozufallszahlen, ein Strom von Zahlen, die so aussehen, als wären sie zufällig generiert worden.

Warum ist es unmöglich, in einem deterministischen Gerät wirklich Zufallszahlen zu erzeugen? Was bedeutet dieser Satz?

48

Man sollte nach einem kryptografisch sicheren Pseudozufallszahlengenerator suchen . Die meisten PRNG sind lineare Kongruenzgeneratoren (also ist next number Eine lineare Funktion von previous number), Wenn Sie also next number Gegen previous number Sie erhalten ein Diagramm mit parallelen Linien. Ein CSPRNG wird das nicht tun. Der Nachteil ist, dass sie langsam sind.

Ich gruppiere Zufallszahlengeneratoren in 3 Kategorien :

  1. Gut genug für Hausaufgaben.
  2. Gut genug, um auf Ihr Unternehmen zu wetten.
  3. Gut genug, um auf Ihr Land zu wetten.

Warum ist es unmöglich, in einem deterministischen Gerät wirklich zufällige Zahlen zu erzeugen?

Ein deterministisches Gerät erzeugt immer die gleiche Ausgabe, wenn die gleichen Startbedingungen und Eingaben gegeben werden - das bedeutet, deterministic zu sein. "Wirklich zufällige Zahl" ist eher eine philosophische Sichtweise, da das, was es bedeutet, random zu sein, der Kern des philosophischen Nabelblicks ist (die Leute sind sich nicht einmal sicher, ob der atomare Zerfall zufällig ist oder einem Muster folgt, das wir haben kann es einfach noch nicht herausfinden). Ein kryptografisch sicherer Zufallszahlengenerator benötigt eine externe Entropiequelle, um das Gerät nicht deterministisch zu machen.

65
Tangurena

Wahre Zufälligkeit impliziert Nichtdeterminismus. Wenn es deterministisch ist, kann es genau vorhergesagt werden (das bedeutet Determinismus); Wenn es vorhergesagt werden kann, ist es nicht zufällig.

Das Beste, was Sie von einem deterministischen Pseudozufallszahlengenerator erhalten können, ist ein Strom von Zahlen mit einem sehr langen Zyklus (eine Nichtwiederholung ist nur möglich, wenn Ihr RNG-Gerät über unbegrenzten Speicher verfügt), der für die Dauer des Zyklus a erzeugt Stream-Nummern, die alle anderen Eigenschaften einer Zufallssequenz erfüllen (eine gleichmäßige Verteilung der Werte ist die interessanteste).

Um dieses Problem zu lösen, haben viele moderne UNIX- und Unix-Likes Kernel-RNGs, die physikalische Rauschquellen verwenden, um echte Zufälligkeit zu erzeugen.

Ein anderer üblicher Ansatz besteht darin, die aktuelle Zeit als Keim für ein deterministisches RNG (srand(time(NULL)); in C) zu verwenden; kryptografisch gesehen ist dies wertlos, da die aktuelle Zeit kein Geheimnis ist, aber für Dinge wie physikalische Simulationen oder Videospiele ist es gut genug.

22
tdammers

Das zweite Kapitel des Buches Discrete-Event Simulation: A First Course von Lawrence Leemis bietet eine fantastische Einführung in Zufallszahlengeneratoren (oder genauer gesagt Pseudozufallszahlengeneratoren).

Ein Auszug aus seinem Buch erklärt es meiner Meinung nach gut:

In der Vergangenheit wurden drei Arten von Zufallszahlengeneratoren für Computeranwendungen empfohlen: (a) Tabellensuchgeneratoren im Stil der 1950er Jahre, wie beispielsweise die Rand Corporation-Tabelle mit einer Million zufälliger Ziffern; (b) Hardware-Generatoren wie beispielsweise thermische Geräte mit "weißem Rauschen"; und (c) algorithmische (Software-) Generatoren. Von diesen drei Typen haben nur algorithmische Generatoren eine breite Akzeptanz erreicht. Der Grund dafür ist, dass nur algorithmische Generatoren das Potenzial haben, alle folgenden allgemein anerkannten Kriterien zur Erzeugung von Zufallszahlen zu erfüllen. Ein Generator sollte sein:

  • zufällig - in der Lage, eine Ausgabe zu erzeugen, die alle vernünftigen statistischen Zufälligkeitstests besteht;
  • steuerbar - kann die Ausgabe auf Wunsch reproduzieren;
  • tragbar - in der Lage, dieselbe Ausgabe auf einer Vielzahl von Computersystemen zu erzeugen;
  • effizient - schnell, mit minimalen Anforderungen an Computerressourcen;
  • dokumentiert - theoretisch analysiert und ausgiebig getestet.

Während es möglich sein könnte, einen Generator für weißes Rauschen zu verwenden, um "bessere" Zufallszahlen zu erhalten, haben sie keine Akzeptanz gefunden, da sie die meisten der oben genannten Kriterien nicht erfüllen.

Ich würde empfehlen, dass Sie eine Kopie dieses Buches (oder etwas Ähnliches) in die Hände bekommen. Wenn Sie genau verstehen, wie die Arbeit von PRNG Sie auf jeden Fall bei Ihren Bemühungen unterstützt.

10
riwalk

Weil Sie Code schreiben müssen, um die Zufallszahlen zu generieren, und Code NICHT zufällig ist. (Es ist deterministisch)

Sie beginnen also mit einem "Startwert (von Startwerten)", der bei "Zufällig" (normalerweise der aktuelle Zeitstempel) ausgewählt wird, und verwenden ihn dann in einem Algorithmus, um mit der Generierung von Zahlen zu beginnen. Der gesamte Satz basiert jedoch auf dem ursprünglichen Wert Seed!)!

Also wenn Sie Ihren Code erneut mit genau den gleichen Seed Wert (en)) ausführen, erhalten Sie genau den gleichen Satz von Zahlen! Wie kann eine vernünftige Person das nennen? zufällig? Aber es sieht sicher aus SIEHT AUS zufällig.


Um sie eindeutig zu machen, überprüfen Sie nach dem Generieren einer Nummer einfach, ob Sie diese Nummer bereits haben. Wenn ja, werfen Sie sie weg und generieren Sie eine neue.

7
Morons

Da Sie Zufallszahlen generieren, sollten Sie erwarten, dass die generierten Werte nicht eindeutig sind. Dies ist eine Eigenschaft der Zufälligkeit - man kann nicht sagen, dass eine Folge von wirklich zufälligen (oder sogar pseudozufälligen) Zahlen eindeutig ist, da diese Anforderung die Vorhersage des Endwerts im Bereich sowie die Änderung der Wahrscheinlichkeit von ermöglichen würde alle nicht gewählten Zahlen jedes Mal, wenn eine neue ausgewählt wird.

5
James McLeod

Ich habe eine sehr einfache Definition von Pseudo Random:

Zu viele unbekannte Variablen, um sie vorherzusagen.

Ich habe auch eine einfache Definition von True Random:

Unendliche unbekannte Variablen.

Das Problem mit einem Computer ist, dass er immer ALLE Variablen kennt. Die Zufallszahl ist einfach eine mathematische Funktion von Startwert.
Das Beste, was wir tun können, ist, dem Computer einen pseudozufälligen Startwert zu geben, der normalerweise auf einer Variablen basiert, die wir nicht vorhersagen können (z. B. die genaue Zeit).

Obwohl ein Computer absolut nicht in der Lage ist, eine Zufallszahl zu erstellen, kann er zu viele Variablen einführen, um sie vorherzusagen!

5
Scott Rippey

Das Generieren von wirklich zufälligen Zahlen in Software ist zwar nicht möglich, wie andere betont haben, es ist jedoch mit Hardware möglich, ein Gerät zu bauen, das wirklich zufällige Zahlen * erzeugen kann. Es gibt einige Beispiele dafür im Internet, und es gibt eine Vielzahl von Methoden, die vom Ablesen der Zeit zwischen den Zecken am Geigerzähler bis zur Abtastung des weißen Rauschens (hauptsächlich Hintergrundstrahlung aus dem Universum) eines nicht abgestimmten Empfängers reichen. Ich selbst habe ein paar gebaut mit ein paar der verfügbaren Methoden.

* Jeder gute Physikfreak wird darauf hinweisen, dass angesichts der Funktionsweise des Universums keines davon hypertechnisch zufällig ist, aber es gibt kein vernünftig Möglichkeit, die Ergebnisse vorherzusagen, damit sie für diese Diskussion ausreichen.

3
Unkwntech

Determinismus ist im Wesentlichen eine Funktion. Denken Sie aus der Algebra daran, dass eine Funktion eine Entsprechung zwischen einer Domäne und einem Bereich ist, sodass jedes Mitglied der Domäne genau einem Mitglied des Bereichs entspricht.

Wenn also f(x) = z, f(x)! = Y, es sei denn, y ist z. Das ist eine Funktion. Stellen Sie sich JavaScript vor:

function Add(A, B) {
      return A + B;
}

var addedNumber = Add(2,3);//returns 5
addedNumber = Add(2,3);//still 5

Egal wie oft Sie Add(2,3) aufrufen, es wird immer 5 zurückgegeben. Mit anderen Worten, Add () ist eine deterministische Funktion.

Externe Faktoren können dazu führen, dass sich Add nicht deterministisch verhält. Zum Beispiel, wenn Sie Multithreading in die Gleichung einführen. Menschliche Eingaben verursachen auch Nichtdeterminismus.

Hier wird es interessant.

"Jeder, der arithmetische Methoden zur Erzeugung zufälliger Ziffern in Betracht zieht, befindet sich natürlich in einem Zustand der Sünde."

Anmerkung Von Neumann stellt fest, "arithmetische Methoden zur Herstellung [...]". Hier geht es nicht um menschliche Eingaben, Parallelität, Beispielwindgeschwindigkeiten, die von einem präzisen Instrument gelesen wurden, oder andere nicht algorithmische Methoden zur Erzeugung zufälliger Eingaben für eine deterministische Funktion .

Dies besagt einfach, dass eine Funktion oder ein Funktionssystem nicht plötzlich nicht deterministisch wird. Mit anderen Worten, Add (2,3) gibt nicht 6 oder etwas anderes als 5 zurück bei gleichen Eingaben. Das ist unmöglich.

Der zitierende Autor geht noch einen Schritt weiter.

Das Beste, auf das wir hoffen können, sind Pseudozufallszahlen, ein Strom von Zahlen, die so aussehen, als wären sie zufällig generiert worden.

Der Kontext wurde zuvor als "auf jedem deterministischen Gerät" definiert. Ich könnte den Streit hier beenden. Was aber, wenn wir den Kontext ändern, indem wir ein neues Element in das System einführen? Ein nicht deterministisches Element, das als Eingabe hinzugefügt wird, macht das System zu einem nicht deterministischen System. Durch das Entfernen des nicht deterministischen Elements werden wir jedoch auf ein deterministisches System reduziert. Wenn wir die Eingaben irgendwie verfolgen oder auf andere Weise reproduzieren können, können wir ein Ergebnis reproduzieren. Aber dieser ganze Absatz ist tangential zu dem, was der Autor sagt. Erinnere dich an den Kontext.

Man könnte über die Bedeutung des Nichtdeterminismus streiten. Noch einmal tangential. Erinnere dich an den Kontext.

Also hat er recht. Auf jedem deterministischen Gerät Es ist für ein deterministisches System unmöglich, ein echtes zufälliges Ergebnis zu erzielen.

2
P.Brian.Mackey

Ohne eine spezielle Hardware können Sie keine Zufallszahl erstellen. In meinem ersten Jahr schlugen ein paar Klassenkameraden und ich einen Zufallszahlengenerator vor, der im Grunde einen AM-Empfänger hat und auf 4 verschiedene Kanäle abgestimmt ist. Holen Sie sich den Eingang in einen A/D-Wandler und fügen Sie sie alle hinzu (modulo Ihre maximale Anzahl). Da die Kombination von Analogeingängen von einer beliebigen Anzahl von Stationen zufällig ist und wir eine große Anzahl von Zufallszahlen aus dem A2D-Wandler erzeugen könnten, schlugen wir vor, dass dies ein guter Generator sein könnte. Natürlich ist auch dies im philosophischen Sinne nicht wirklich zufällig, obwohl dies für die meisten praktischen Zwecke funktionieren könnte.

2