Wie funktionieren Zufallszahlengeneratoren?

23

Ich habe nur über die PHP- rand()Funktion nachgedacht und darüber nachgedacht, wie ich sie neu erstellen könnte, und bin völlig verblüfft aufgetaucht.

Wie funktionieren Zufallszahlengeneratoren?

Korvin Szanto
quelle
2
Pseudozufallszahlengeneratoren verwenden einen Startwert, eine Tabelle vordefinierter Konstanten und mathematische Formeln. Echte Zufallszahlengeneratoren verwenden normalerweise atmosphärisches Rauschen. Sie können leicht Zufallszahlen aus / dev / random abrufen.
Rightfold
Ist das Umgebungsgeräusch garantiert zufällig?
14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Neil
3
Jemand muss das tun: xkcd.com/221 ;)
Valera Kolupaev

Antworten:

7

Zufallszahlengeneratoren (Random Number Generators, RNGs) generieren tatsächlich Pseudozufallszahlen, da es unmöglich ist, tatsächlich eine WIRKLICHE Zufallszahl zu generieren. Die einzigen wirklich wirklich zufälligen Dinge sind Taten Gottes, wie der Blitz.

Dieser Wikipedia-Artikel kann Ihnen möglicherweise bei der Erklärung helfen: http://en.wikipedia.org/wiki/Random_number_generators


Soweit ich weiß, gibt es im Grunde genommen zwei Teile eines RNG: den Samen und dann die Zufallszahl, die aus diesem Samen ausgewählt wurde. Wenn Sie das RNG aussäen, geben Sie es einem Startpunkt gleich. Dieser Startpunkt enthält dann eine Reihe von Zahlen, die sich "im Inneren" befinden, aus denen das Programm auswählt. In PHP können Sie srand () verwenden, um die Seeds zu "mischen", sodass Sie fast immer eine andere Antwort erhalten. Sie können dann rand (min, max) verwenden, um in den Startwert einzusteigen und eine Zahl zwischen min und max (einschließlich) auszuwählen.


WARNUNG, MÖGLICHE KÄSEANALOGIE VORAUS!

Stellen Sie sich jeden Samen als eine Eiskiste vor und dann die Zufallszahlen als Eiswürfel. Angenommen, Sie haben 1000 Eistruhen und jede Truhe enthält 1000 Eiswürfel. Auf dem Jahrmarkt wählen sie eine Kühltruhe aus, um Getränke zuzubereiten, und sie können nur einen Eiswürfel verwenden. Sie benötigen jedoch nur Eiswürfel, die größer als 1 Kubikzoll sind. Also wählen sie zufällig eine Truhe aus diesen 1000 Truhen aus und dann wählen sie zufällig einen Eiswürfel in dieser Truhe aus. Wenn es für die gewünschte Größe funktioniert, wird es verwendet. Wenn nicht, legen sie es mit den anderen in die Truhe zurück. Wenn sie es ein bisschen lustiger machen wollen, tauschen sie vorher die Truhen aus, damit sie nichts merken, wenn man so will!

Was die physische Auswahl des Ausgangs und der Zufallszahl durch PHP angeht, so habe ich nicht genug Wissen darüber (worüber Sie sich wahrscheinlich am meisten gewundert haben!). Ich würde nicht versuchen, die rand () - Funktion zu wiederholen. Für die meisten webbasierten Anwendungen, die Sie erstellen, sollte rand () für jede beliebige Zahl ausreichen, die Sie benötigen.

Schauen Sie sich auch lineare Kongruenzgeneratoren an. Vielleicht suchen Sie mehr danach, wenn Sie die schmutzigen Details sehen möchten: http://en.wikipedia.org/wiki/Linear_congruential_generator

Hoffe das hilft!


quelle
7
Wie würden Handlungen godim geringsten zufällig sein? Darüber hinaus ist der Blitz auch nicht zufällig, sondern folgt einem Pfad, der von verschiedenen Bedingungen bestimmt wird. Auch der die Nummer erzeugende Interpreter ist im Wesentlichen irrelevant.
7
Ich benutze Handlungen Gottes im rechtlichen Sinne: en.wikipedia.org/wiki/Act_of_God Sie werden als zufällig angesehen, da sie sich der menschlichen Kontrolle entziehen.
4
Es gibt also nichts, was zufällig ist. Aber das würde erfordern, dass jedes scheinbar zufällige Ereignis beeinflusst wird, was nicht funktioniert, wenn man ganz am Anfang der Zeit angelangt ist. Es sieht so aus, als würde ich einige Philosophiestunden belegen = D
6
@Korvin Soweit wir wissen, sind Quantenphänomene wie der radioaktive Zerfall oder die Emission eines Photons durch ein angeregtes Atom rein zufällig. Mathematiker und Philosophen streiten sich jedoch darüber, was es bedeutet, wirklich zufällig zu sein. Und während gewöhnliche Leute einen Münzwurf für ziemlich zufällig halten, können agile Bühnenmagier ( news.stanford.edu/pr/2004/diaconis-69.html ) regelmäßig 10 Köpfe bei 10 Flips erhalten.
Charles E. Grant
1
@Charles - Ein Münzwurf ist nicht einmal ein binärer Kopf / Zahl, er ist tatsächlich Kopf / Zahl / Kante, also könnte ein wirklich guter Bühnenmagier ihn dazu bringen, weder Kopf noch Zahl zu verlieren. * 8 ')
Mark Booth
18

Sie sind normalerweise nicht wirklich zufällig, sondern werden als Pseudozufall bezeichnet, da sie eine zufällig erscheinende Zahlenfolge erzeugen. Dies geschieht mit einigen interessanten mathematischen Formeln. Einer der häufigsten ist der lineare Kongruenzgenerator .

Pseudozufallszahlen haben eine nützliche Eigenschaft, die echte Zufallszahlen nicht haben: Wenn Sie beim Start denselben Startwert verwenden, erhalten Sie eine identische Sequenz zurück. Dies kann zum Testen sehr praktisch sein.

Mark Ransom
quelle
Wenn ich Ihre zweite Aussage richtig verstehe: random(5332)Wird sie immer gleich sein random(5332)?
2
@Korvin, nein, ich meine, wenn Sie anrufen, srand(5332)wird die nächste zurückgegebene Nummer randimmer dieselbe sein.
Mark Ransom
3
"Erscheint zufällig" -> haben die gleichen statistischen Eigenschaften wie echte Zufallszahlen.
+1 für den LGC-Wikipedia-Link bietet eine hervorragende Animation, warum einfache PRNGs bei mehrdimensionalen Monte-Carlo-Simulationen schwerwiegende Einschränkungen aufweisen.
Mark Booth
4

Fragen Sie nach Pseudozufall oder Zufall? Andere antworteten über Pseudozufall, lassen Sie mich über Random sprechen.

Es gab (gibt?) Tatsächlich hardwarebasierte Zufallszahlengeneratoren im Verkauf. Sie basierten auf einem Chip mit einem kleinen Radio, der das weiße Rauschen der Strahlung im Weltraum misst, oder einer kleinen radioaktiven Probe und Messperioden zwischen deren Zerfall. Das Problem bei ihnen war die Bandbreite - die Menge an Entropie, die sie erzeugen konnten, war nicht sehr hoch, so dass sie für Keime von Pseudozufallsalgorithmen verwendet wurden. Sie wurden in Banksystemen, Hochsicherheitssystemen und dergleichen eingesetzt.

OTOH, wenn Sie einen Embedded-Systementwickler treffen, wird dieser darüber lachen. Für übliche Zwecke bei der Programmierung eines Mikrocontrollers führt das Lesen niedriger 4-Bit-Werte eines 16-Bit-Analog-Digital-Wandlers mit einem potentialfreien (nicht verbundenen) Pin zu einem einwandfreien Zufallsrauschen bei mehr als ausreichender Bandbreite (je kürzer die Abfragezeit, desto mehr). laut "das Auslesen) und einfacher als das Schreiben der eigentlichen RNG-Routine. Und wenn man bedenkt, dass ADCs häufig in Silizium von Mikrocontrollern implementiert sind, häufig implementiert und häufig mit 8 Kanälen implementiert sind, von denen Sie möglicherweise 5 für Ihre Anwendung benötigen, ist dies praktisch kostenlos.

Und selbst wenn Sie keinen ADC haben, erzeugen einige Elemente, die an einen digitalen GPIO-Pin angeschlossen sind, ein ziemlich gutes Rauschen. In embedded ist Rauschen allgegenwärtig (und wird ständig bekämpft), so dass es sehr einfach ist, echte Zufälligkeiten zu erhalten.

SF.
quelle
2

Es gibt viele Möglichkeiten, eine "zufällige" Folge von Zahlen zu emulieren. Ihr erster Halt sollte sicher sein, über lineare Kongruenzgeneratoren zu lesen . So funktionieren die meisten einfachen Zufallszahlengeneratoren, und ich wette, so funktioniert die rand () - Funktion von PHP.

Die interessantere nächste Frage ist, wie es sich selbst aussät. Zeit? IP Adresse? etc.


quelle
Der Samen ist das, was mich verwirrt, ich kann mir nichts vorstellen, was die Funktion möglicherweise ohne irgendein Muster aussäen könnte, und selbst wenn nicht, was bewirkt, dass der zufällige Samen überhaupt erzeugt wird!
3
Ich glaube, ein Zeitstempel wird oft als Ausgangswert verwendet, wenn keiner von einer anderen Quelle stammt. In der alten BASIC-Version RANDOMIZE TIMERwar dies eine verbreitete Redewendung und für die meisten (nicht kryptografischen) Zwecke "gut genug". Laut man 3 srand verwendet die GNU C-Bibliothek einen festen Startwert von 1, bis das PRNG erneut ausgesät wird.
ein CVn
1

Erstens rand()liefern praktisch alle Funktionen keine echte Zufälligkeit, sondern sogenannte Pseudozufallszahlen.

Wie funktionieren Pseudozufallszahlengeneratoren? Grundsätzlich funktioniert die Verschlüsselung so: Sie haben eine Funktion (einen Hash), der Eingaben entgegennimmt und Ausgaben auf eine so komplexe Weise erzeugt, dass es unmöglich ist, die Eingabe von der Ausgabe zu erraten oder umgekehrt. Das heißt, jeder Chiffrier kann verwendet werden, um einen ziemlich guten Pseudozufallsgenerator zu erzeugen. Während Sie im Prinzip jeden Pseudo-Zufallsgenerator für die Verschlüsselung verwenden könnten, sind die meisten Pseudo-Zufallszahlengeneratoren in erster Linie für die Geschwindigkeit und nicht für die kryptografische Sicherheit entwickelt worden, sodass sie Hackern keine Kopfschmerzen bereiten.

Für einen Pseudozufallsgenerator wird die Hash-Funktion auf einen verborgenen internen Zustand des Generators angewendet, und seine Ausgabe wird verwendet, um a) diesen internen Zustand zu modifizieren und b) die Ausgabe der rand()Funktion zu berechnen . Der nächste Aufruf von rand()wird diesen geänderten internen Zustand verwenden und somit ein anderes Ergebnis erzeugen. Je besser die Hash-Funktion ist, desto weniger können die Ergebnisse von echten Zufallszahlen unterschieden werden.


Tatsächlich haben Computer heutzutage Zugang zu reellen Zufallszahlen: Sie entstehen durch Jitter beim Timing von Interrupts, die von externen Geräten erzeugt werden. Linux verwendet diese Werte geringer Unsicherheit, um ständig einen "Entropie-Pool" aufzubauen, der nur wenige Kilobyte des internen Zustands beträgt. Kryptografische Hashes, die auf diesem Entropiepool basieren, werden über die Geräte /dev/randomund zur /dev/urandomVerfügung gestellt. Der Zugriff auf einige wirklich sehr gute Zufallszahlen ist also so einfach wie das Öffnen eines dieser beiden Geräte und das Lesen einiger Bytes von ihnen.

cmaster
quelle
-2

Zufallszahlen sind Zahlen, die von dem Prozess generiert werden, dessen Ausgabe nicht vorhersehbar ist. dh wir können nicht sagen, was als nächstes ausgegeben wird. Wir können ein einfaches Beispiel für das Ergebnis der Würfel nehmen. Was ausgegeben wird, wenn wir einen Würfel werfen, ist unvorhersehbar.

Es gibt zwei Arten von Zufallszahlen: 1. Echte Zufallszahlen 2. Pseudo-Zufallszahlen.

Wie Zufallszahlen erzeugt werden

Badal
quelle
1
Verwenden Sie die Zitatformatierung, um hervorzuheben, welche Teile der Antwort Ihnen gehören und welche aus der von Ihnen angegebenen Quelle stammen. Wenn Sie lediglich eine externe Quelle zum Kopieren / Einfügen ausgewählt haben, ist dies hier keine gute Antwort.
Mat
dies scheint nicht zu bieten alles wesentliche über gemacht Punkte und erläuterte vor 6 Antworten
gnat