Zufallszahlengenerator
Als Zufallszahlengenerator, kurz Zufallsgenerator, bezeichnet man ein Verfahren, das eine Folge von Zufallszahlen erzeugt. Der Bereich, aus dem die Zufallszahlen erzeugt werden, hängt dabei vom speziellen Zufallszahlengenerator ab.
Man unterscheidet grundsätzlich zwischen nicht-deterministischen und deterministischen Zufallszahlengeneratoren. Nicht-deterministisch ist ein Zufallszahlengenerator, wenn er auch bei gleichen Ausgangsbedingungen unterschiedliche Werte liefert. Da die Implementierung einer Software-Prozedur in der Regel deterministisch arbeitet, muss zur Realisierung eines nicht-deterministischen Zufallszahlengenerators ein externer (beispielsweise physikalischer) Vorgang einbezogen werden. Ein deterministischer Zufallszahlengenerator liefert bei gleichen Ausgangsbedingungen dagegen immer die gleiche Folge von Zahlen. Oft werden beide Formen zu einem hybriden Generator kombiniert.
Zufallszahlen werden unter anderem bei verschiedenen Methoden der Statistik benötigt, z. B. bei der Auswahl einer Stichprobe aus einer Grundgesamtheit, bei der Verteilung von Versuchstieren auf verschiedene Versuchsgruppen (Randomisierung) oder bei der Monte-Carlo-Simulation. Typische weitere Anwendungsgebiete sind (Computer-, Glücks-)spiele und diverse Kryptographieverfahren.
Nichtdeterministische Zufallszahlengeneratoren
Physikalischer Zufallszahlengenerator
Ein physikalischer Zufallszahlengenerator dient der Erzeugung von Zufallszahlen und benutzt dafür physikalische Prozesse.
Hierbei werden beispielsweise Impulsschwankungen elektronischer Schaltungen (z. B. thermisches Rauschen eines Widerstands) oder radioaktive Zerfallsvorgänge ausgenutzt. Generell können alle natürlichen Quellen verwendet werden, die auf physikalischen Effekten basieren und eine recht hohe Güte liefern, aber auch andere asynchrone Quellen, wie z. B.:
- Atmosphärenrauschen (wie analoges Radio, das nicht auf einen Sender abgestimmt ist)
- CCD-Sensorrauschen (mit einer schlechten (z. B. alten Mobiltelefon-) Kamera in einem dunklen Raum fotografieren und daraus Zufallszahlen ableiten)
- Radioaktiver Zerfall
- Schwankung der tatsächlichen Zeitdauer einer mit einem Zeitgeber („Timer“) gemessenen Zeitdauer.[1]
- Spannungsschwankungen an einer Z-Diode
- Lawinenrauschen an einer pn-Diode
Allerdings gelten physikalische Zufallszahlengeneratoren nicht als schnell, da eine Unabhängigkeit und Gleichverteilung der erzeugten Zufallszahlen nur durch hinreichend große Abstände bei der Beobachtung der physikalischen Prozesse bzw. Abfangverfahren erreicht werden können. Dies ist aber nur eine Frage der verwendeten Technik, denn Zufallsprozesse wie thermisches Rauschen haben Grenzfrequenzen von vielen Terahertz.
Auch ist eine Reproduzierbarkeit der Ergebnisse prinzipiell nicht möglich, da die produzierten Zufallszahlen echt zufällig sind (so wie die Lottozahlen). Dadurch sind die produzierten Zufallszahlen aperiodisch, d. h. die sich nicht wiederholende Folge der Zufallszahlen ist (prinzipiell, d. h. wenn der Generator lange genug läuft) unendlich.
Beispielsweise kann ein Geigerzähler die Zahl der radioaktiven Zerfälle in einer bestimmten Zeitspanne messen. Man nutzt die Tatsache, dass ein radioaktives Nuklid nach einer rein zufälligen Zeit in sein Tochternuklid zerfällt. Die Zeitspanne hat aber beim gleichen Nuklid immer den gleichen Mittelwert (die sogenannte mittlere Lebensdauer, die mit der Halbwertszeit über den Faktor zusammenhängt.[2]) Da der radioaktive Zerfall immer unabhängig von Umgebungsbedingungen abläuft, kann dieser Vorgang Zufallszahlen hoher Güte liefern.
Daneben können auch Rauschgeneratoren als Zufallsgeneratoren verwendet werden.[3]
Eine Methode zum Aufbau von Zufallsgeneratoren in digitalen Schaltungen besteht in der Ausnutzung der Metastabilität bei taktflankengesteuerten Flipflops.[4]
Gute physikalische Verfahren zur Generierung von Zufallszahlen sind auch das Würfeln und die Ziehung von Lottozahlen mit den dafür typischen Maschinen. Zufallsziehungen in relativ schneller Abfolge wurden bei elektromechanischen Glücksspielautomaten realisiert, und zwar auf Basis von Nockenscheiben mit Exzenterrrädchen und einem Schaltzeitvariator.[5]
Bei physikalischen Zufallszahlengeneratoren besteht jedoch das Problem der Alterung. Beispielsweise haben Geiger-Müller-Zählrohre eine Lebensdauer von typischerweise einer Billion Pulse und sind zudem abhängig von Temperatur, Magnetfeldern und der Versorgungsspannung. Zudem muss bei Geigerzählern die Pulsrate „deutlich höher“ als die Taktfrequenz sein, mit der die Pulse eingelesen werden. Eine Lösung dieses Problems besteht in der Verwendung vieler (mehr oder weniger guter) Zufallszahlengeneratoren, wobei von den erzeugten Zufallszahlen nur das letzte Bit verwendet wird, um damit die Modulo-Zwei-Summe zu bilden. Nach dem zentralen Grenzwertsatz der Statistik erhält man damit auch mit schlechten Zufallszahlengeneratoren perfekt zufällige Zufallsbits (sofern genügend viele Zufallszahlengeneratoren verwendet werden).
Eine der einfachsten Möglichkeiten, wirklich zufällige Sequenzen zu erzeugen, verwendet Lawinenrauschen in einem umgekehrt vorgespannten Übergang. Wenn eine Diode in Sperrrichtung vorgespannt ist, fließt tatsächlich nur ein sehr geringer Strom, und in erster Näherung kann die Diode als offener Stromkreis betrachtet werden. Wenn die Sperrspannung jedoch erhöht wird, wird ein Punkt erreicht, an dem der Strom dramatisch ansteigt. Dieser schnelle Anstieg des Stroms unter Sperrspannung kennzeichnet den Durchbruch, und die entsprechende angelegte Spannung wird als Durchbruchspannung bezeichnet. Es gibt zwei Mechanismen, die einen Zusammenbruch verursachen können, nämlich die Lawinenvervielfachung und das quantenmechanische Tunneln von Ladungsträgern durch die Bandlücke.
Die durch den großen Durchbruchstrom und die hohe Durchbruchspannung verursachte Erwärmung führt jedoch dazu, dass die Diode zerstört wird, wenn keine ausreichende Wärmeableitung bereitgestellt wird. Lawinenrauschen ist das Rauschen, das erzeugt wird, wenn eine pn-Diode zu Beginn des Lawinendurchbruchs betrieben wird. Es tritt auf, wenn Ladungsträger unter dem Einfluss des starken elektrischen Feldes genügend kinetische Energie erhalten, um durch Kollision mit den Atomen im Kristallgitter zusätzliche Elektron-Loch-Paare zu erzeugen. Wenn dieser Prozess in einen Lawineneffekt übergeht, können zufällige Rauschspitzen beobachtet werden. Um ein solches Rauschen zu erzeugen, kann man den Basis-Emitter-Übergang eines Kleinsignal-Transistors verwenden, da dieser Übergang für viele gängige Geräte eine relativ niedrige Durchbruchspannung hat. Die Menge an erzeugtem Rauschen hängt von den physikalischen Eigenschaften des Übergangs ab, wie zum Beispiel den verwendeten Materialien und dem Dotierungsniveau.[6]
Quasizufällige Ereignisse
Es wird beispielsweise die Systemzeit bestimmt, innerhalb der eine Benutzeraktion eintritt. Auf diese Weise erzeugte Zufallszahlen haben meist eine geringe Güte, lassen sich aber als Startwert für deterministische Verfahren verwenden.
Deterministische Zufallszahlengeneratoren
Deterministische Zufallszahlengeneratoren erzeugen Pseudozufallszahlen und werden daher in der Regel Pseudozufallszahlengeneratoren genannt (engl. pseudo random number generator, PRNG). Sie erzeugen eine Zahlenfolge, die zwar zufällig aussieht, es aber nicht ist, da sie durch einen deterministischen Algorithmus berechnet wird. Solche Pseudozufallszahlen sind von Computern wesentlich einfacher zu erzeugen und in praktisch allen höheren Programmiersprachen verfügbar.
Bei jedem Start der Berechnung mit gleichem Startwert (engl. seed, d. h. Saatkorn) wird die gleiche Folge erzeugt, weshalb diese deterministisch erzeugten Pseudozufallszahlen bei hinreichend genauer Dokumentation später reproduziert werden können. Diese Eigenschaft der Reproduzierbarkeit ist bedeutsam für die Anerkennung wissenschaftlicher Experimente.
Auszählreime in Kinderspielen stellen auch eine Art deterministischer Zufallszahlengeneratoren dar.
Güte eines Zufallszahlengenerators
Die erzeugten Zahlen können durch statistische Tests geprüft werden. Dazu gehört die erzeugte Verteilung (z. B. Normalverteilung, Gleichverteilung, Exponentialverteilung etc.) oder die Unabhängigkeit aufeinanderfolgender Zahlen. Wie gut die erzeugten Zahlen den statistischen Vorgaben entsprechen, bestimmt die Güte eines Zufallszahlengenerators.
Am Beispiel eines Zufallszahlengenerators, der nur die Zahlen 0 und 1 ausgeben kann (z. B. simulierter Münzwurf), kann man sich klarmachen, dass allein die gleiche Häufigkeit beider Ergebnisse nicht ausreicht, da etwa die Folge 0, 1, 0, 1, 0, 1, 0, 1, … intuitiv nicht zufällig erscheint. Es sollten im optimalen Fall auch alle möglichen Paare aufeinander folgender Ergebnisse mit den erwarteten Häufigkeiten auftreten, ja möglichst auch Tripel, Quadrupel usw. Diese Überlegungen führen auf den Spektraltest.
Ein sehr einfaches Gütekriterium ist die Periodenlänge, die im Verhältnis zum Wertebereich möglichst lang sein sollte. Dies ist etwa beim Mersenne-Twister in besonders starkem Maße der Fall. Ein simpler linearer Kongruenzgenerator kann dagegen den Wertebereich pro Periode bestenfalls einmal durchlaufen; dies sollte umgekehrt als Mindestanforderung gesehen werden und kann durch ein einfaches Kriterium geprüft werden (Satz von Knuth).
Weitere Gütetests beruhen auf dem Chi-Quadrat-Test, dem Kolmogorow-Smirnow-Test u. a.
Knuth listet noch zahlreiche andere Tests, so den „serial test“, den Lücken-Test, den Poker-Test, den Couponsammler-Test, den Permutations-Test, den Lauf-Test, den Maximum-aus--Test und den Kollisions-Test. Es kommt vor, dass ein Generator bei mehreren Tests sehr gut abschneidet, aber bei einem anderen versagt. Für einige Anwendungen wie Simulationen, die den entsprechenden Testbedingungen nahe sind, ist ein solcher Generator dann ungeeignet.[7]
Besonders strenge Anforderungen werden an kryptographisch sichere Zufallszahlengeneratoren gestellt.
Nicht-periodischer/unendlicher Generator
Man betrachte die Nachkommastellen der Quadratwurzel einer natürlichen Zahl als Zufallszahlen (hierbei ist selbstverständlich darauf zu achten, dass die resultierende Wurzel eine irrationale Zahl ist). Klassischerweise kann man statt auch die Kreiszahl verwenden. Zwar ist hierbei garantiert, dass die erzeugte Zahlenfolge nicht periodisch ist; jedoch ist bei diesen Beispielen noch nicht einmal bekannt, ob sie gleichverteilt ist (von weitergehenden statistischen Tests ganz zu schweigen; siehe Normale Zahl).
Softwaretechnische Realisierungen
- Arithmetische Zufallszahlengeneratoren basieren auf der Arithmetik. Irrationale Zahlen wie oder können als Zufallszahlengeneratoren verwendet werden, indem man den gebrochenen Teil beliebiger Vielfache als Zufallszahlen nutzt. Nachteil des Verfahrens ist, dass sich irrationale Zahlen nur als Näherungswerte innerhalb der Rechengenauigkeit darstellen lassen.
- Rekursiver arithmetischer Zufallszahlengenerator: Diese Verfahren beruhen auf der Berechnung einer neuen Zufallszahl aus einer oder mehreren vorhergehenden Zahlen. Die neu erzeugte Zahl wird gespeichert und geht bei erneutem Aufruf des Zufallszahlengenerators in die Berechnung ein. Beim allerersten Aufruf des Zufallszahlengenerators muss ein willkürlich gewählter Startwert, die Saat (meist engl. seed), verwendet werden.
- Kongruenzgenerator
- linearer Kongruenzgenerator
- multiplikativer Kongruenzgenerator
- gemischter linearer Kongruenzgenerator
- Fibonacci-Generator
- linearer Kongruenzgenerator
- Inverser Kongruenzgenerator
- Mersenne-Twister
- Multiply-with-carry
- Well Equidistributed Long-period Linear
- Xorshift
- Block- oder Stromchiffren, kryptologische Hashfunktionen
- Kongruenzgenerator
Hardwaretechnische Realisierungen
- Schieberegister mit Rückkopplung
- lineares Schieberegister
- nichtlineares Schieberegister
Programmierung
In der Programmiersprache C++ können Zufallszahlen mit der Funktion rand() der Standardbibliothek generiert und auf einfache Weise verwendet werden.[8][9]
Ein einfacher Zufallsgenerator kann auch neu programmiert werden. Das folgende Programm zeigt die Implementierung eines linearen Kongruenzgenerators mit , und . Es erzeugt 10 Zufallszahlen, die in einem Array gespeichert werden. Bei der Ausführung des Programms wird die Hauptfunktion main verwendet, die die Zufallszahlen auf der Konsole ausgibt.[10][11]
#include <iostream>
using namespace std;
// Funktion, die die Zufallszahlen erzeugt
int* linearCongruentialGenerator(int y0, int m, int a, int b, int count)
{
int* randomNumbers = new int[count]; // Inititialisiert das Array für die Zufallszahlen
randomNumbers[0] = y0; // Startwert für den Zufallszahlengenerator
for (int i = 0; i < count; i++)
{
randomNumbers[i] = (a * randomNumbers[i - 1] + b) % m;
}
return randomNumbers;
}
// Hauptfunktion die das Programm ausführt
int main()
{
int y0 = 0; // Deklaration der lokalen Variablen
int m = 2147483648;
int a = 214013;
int b = 2531011;
int count = 10;
int* randomNumbers = linearCongruentialGenerator(y0, m, a, b, count); // Aufruf der Funktion
for (int i = 0; i < count; i++)
{
cout << randomNumbers[i] << endl; // Ausgabe auf der Konsole
}
}
Hybride Generatoren
In der Praxis verwendet man häufig arithmetische Zufallszahlengeneratoren, die eine Mischform sind. Sie berechnen Pseudozufallszahlen, verwenden dafür allerdings – bei Bedarf – einen echt zufälligen Startwert. Die Entropie der generierten Zufallszahl kann jedoch nicht größer sein als die des Startwerts.
In der Praxis findet man solche hybriden Zufallszahlengeneratoren unter unixoiden Betriebssystemen wie Linux oder BSD unter /dev/random
und /dev/urandom
. Diese zeigen praktisch keinerlei statistische Auffälligkeiten. Ihre Initialisierung erfolgt in den meisten Fällen jedoch nicht mit den beschriebenen Methoden, sondern durch Auswertung des zeitlichen Abstandes von Hardwareereignissen (Tastatureingaben, Netzwerkverkehr und Ähnliches), die ebenfalls als zufällig erachtet werden können.
Im einfachsten Fall wird ein Pseudozufallszahlengenerator gewählt, der gelegentlich mit einer neuen echten Zufallszahl als Startwert neu gestartet wird.
Weblinks
Einzelnachweise
- timer entropy daemon
- D. Meschede (Hrsg.): Gerthsen Physik. 23., überarbeitete Auflage, Springer 2006, S. 986
- W. Baier (Hrsg.): Elektronik Lexikon. 2. Auflage. Franckh'sche Verlagshandlung, Stuttgart 1982, S. 485.
- D. J. Kinniment et al.: Design of an on–chip random number generator using metastability. In: Proceedings of the 28th European Solid-State Circuits Conference, 24.–26. September 2002, S. 595–598.
- Wolfgang Scheibe, Zufallsgeber in Geldspielgeräten, Automaten-Markt, Heft 5, 1966, S. 523–534, online (Memento vom 27. August 2019 im Internet Archive).
- Giorgio Vazzana: Random Sequence Generator based on Avalanche Noise
- D. E. Knuth, The Art of Computer Programming, Volume 2: Seminumerical Algorithms. Addison-Wesley, Reading (MA) 1997, ISBN 0-201-89684-2.
- cplusplus.com: rand
- cppreference.com: std::rand
- Rosetta Code: Linear congruential generator
- GeeksforGeeks: Linear Congruence method for generating Pseudo Random Numbers