Zufallszahlen (Kofler, 1.draft)

Transcrição

Zufallszahlen (Kofler, 1.draft)
Zufallszahlen
Zufallszahlen werden auf vielen Gebieten der Naturwissenschaft und Technik bei stochastischen Simulationen
eingesetzt, um einerseits analytisch gewonnene Ergebnisse zu überprüfen und andererseits zu Aussagen über
das Verhalten von zufallsbeeinflussten Systemen auch dann zu gelangen, falls es nicht möglich ist, analytische
Ergebnisse zu berechnen. Bei diesen Simulationen werden stochastisch beeinflusste Eingabedaten durch einen
Zufallszahlengenerator nachgebildet. Hier wie in allen anderen Fällen kommt es darauf an, dass die
Simulation unbedingt zuverlässige Ergebnisse liefert. Die Qualität der getroffenen Aussagen hängt von der
Qualität der zugrundeliegenden Daten ab. Daher ist es notwendig, dass auch der verwendete Zufallsgenerator
wirklich zuverlässig ist.
Einsatzgebiete
•
•
•
•
•
•
•
•
•
Evelin Kofler
Generierung von Geheimnummern oder Transaktionsnummern
Verschlüsselung von Daten (z.B. für die Kommunikation im Internet)
Digitale Unterschriften
Direkte Verwendung für Monte-Carlo-Simulationen
Referenz für statistische Zufallszahlen-Tests
Numerische Lösung mathematischer Probleme
Steuerung/Test von Glücksspielautomaten
Generierung von Lottozahlen
usf.
Zufallszahlen – first draft
Seite 1
Bei der Erzeugung von Zufallszahlen unterscheidet man zwischen echten Zufallszahlen und PseudoZufallszahlen. Echte Zufallszahlen können z.B. durch Wurf mit einem (ungezinkten) Würfel (der einfachste
Zufallszahlengenerator für die Zahlen von 1 bis 6) oder durch Beobachtung physikalischer Vorgänge (z. B.
physikalischer Zerfall) gewonnen werden. Pseudo-Zufallszahlen werden durch spezielle deterministische
Algorithmen mit Hilfe des Computers erzeugt. Sie entstehen also nicht „zufällig“, wie die echten
Zufallszahlen, sondern sind streng determiniert.
Unter einem Zufallszahlengenerator versteht man nun ein Verfahren, welches eine Folge von Zahlen erzeugt,
die möglichst viele Eigenschaften einer Zufallszahlenfolge besitzt. Da die Folge durch ein Verfahren, also
einen deterministischen Algorithmus erzeugt wird, kann sie prinzipiell nicht zufällig angeordnet sein. Fast alle
Programmiersprachen verfügen über Sprachelemente zur Erzeugung von sogenannten Pseudo-Zufallszahlen.
Die Vorteile echter Zufallszahlen gegenüber von Zufallsgeneratoren erzeugter Pseudo-Zufallszahlen liegen auf
der Hand:
•
•
•
•
•
keine Periodizitäten
keine Vorhersagbarkeit der Zufallszahlen aufgrund vorangehender Sequenzen
keine irgendwie geartete Systematik (⇒ Daten können absolut sicher verschlüsselt werden)
Gewissheit, dass keine versteckten Korrelationen vorliegen
Gewissheit, dass die Schwankungen in der Gleichverteilung rein stochastisch sind (PseudoZufallszahlen weisen systematisch, d.h. unnatürliche Schwankungen in der Gleichverteilung auf)
Zufallszahlenfolgen kann man mit Würfeln, Losen oder Münzen erzeugen. Solchen physikalischen Verfahren
stehen algorithmische Verfahren gegenüber, die Zufallszahlen nach einer bestimmten Rechenvorschrift
Evelin Kofler
Zufallszahlen – first draft
Seite 2
berechnen. Die physikalischen Verfahren sind nur auf den ersten Blick besser. Sie haben Nachteile: Sie
bedürfen der Wartung und der Eichung, und man kann die erzeugten Zahlenfolgen nicht reproduzieren, was für
viele Experimente wünschenswert ist. Die algorithmischen Verfahren, welche heute praktisch benutzt werden,
haben diese Nachteile nicht. Sie liefern Zahlenfolgen mit guten statistischen Eigenschaften.
Alle praktisch bedeutenden Zufallszahlengeneratoren arbeiten rekursiv. Diese Generatoren erzeugen
•
•
•
zuerst eine gewisse Anfangsfolge,
danach einen nullten Zyklus: eine Folge, die
im ersten Zyklus exakt wiederholt wird usw.
Die Anzahl der Zahlen innerhalb eines Zyklus heißt Zykluslänge des Generators. Am Beginn der Arbeit muss
eine Zahl als Startpunkt gewählt werden. Diese erste Zahl einer Zufallszahlenfolge wird Anfangswert (engl.
seed) genannt.
Zufallsquellen in einem Modell müssen statistisch unabhängig sein, damit Änderungen eines Teils des Modells
keinen Einfluss auf das Verhalten anderer Teile haben.
Das kann man am Beispiel der Simulation eines Friseursalons erklären: Die Ankunft von Kunden sowie die
Dauer eines Haarschnitts (bzw. einer Rasur) sind Zufallsvariablen. Beim Experimentieren mit dem Modell
wird man sicherlich die Ankunftsrate, die Bedienungsrate oder beides verändern und sehen, was geschieht.
Würden die Zufallsvariablen mit demselben Pseudozufallszahlenstrom erzeugt werden, dann wären die beiden
Zufallsquellen nicht unabhängig. Man könnte z. B. nicht die Auswirkungen eines veränderten Kundenstroms
bei gleichbleibenden Bedienungszeiten untersuchen. Die Verwendung von zwei unabhängigen
Evelin Kofler
Zufallszahlen – first draft
Seite 3
Pseudozufallszahlenströmen ist zu bevorzugen. Wird diese Methode angewandt, können entweder die
Ankunfts- oder die Bedienungsrate unabhängig voneinander verändert werden, was das Experimentieren mit
dem zu modellierenden System erleichtert. Es gibt Softwareprodukte, welche den Einsatz von mehreren
Pseudozufallszahlenströmen gestatten (→ link zu GPSS).
Eine weitere Forderung ist eine schnelle Verfügbarkeit der Zufallszahlen während des Simulationsvorgangs.
Falls die Zufallszahlen zur Zeit der Benutzung laufend erzeugt werden sollen, muss die Generationsdauer
entsprechend kurz sein, wodurch jedoch in der Regel eine unzureichende Qualität der Zufallszahlen entsteht.
Um unabhängig von der Generierungsrate zu sein, kann man einen Tabellengenerator benutzen, bei dem die
Zufallszahlen vor der Benutzung erzeugt und abgespeichert worden sind. Werden die Zufallszahlen dann
benötigt, können sie schnell aus der Tabelle herausgelesen werden.
In der Praxis werden die Zufallszahlen häufig aus einer rekursiven Rechenvorschrift gewonnen, nach der aus
dem oder einigen Vorgängern eine weitere Zufallszahl gebildet wird. Die so erzeugten Sequenzen sind im
strengen Sinn nicht zufällig und werden daher als pseudozufällig bezeichnet, können aber als ausreichend
zufällig angesehen werden, falls sie die geforderten Qualitätsansprüche erfüllen. Hierzu beobachtet man eine
solche Sequenz, bestimmt ihren Mittelwert, Momente der Verteilung sowie die Korrelationen und andere
Eigenschaften und entscheidet dann, ob sie den gestellten Anforderungen genügt.
Physikalischer Zufallszahlengenerator: z. B. der Zufallszahlengenerator PURAN (→ link), ein
Rauschgenerator, welcher ein 1,5 GHz-Rauschsignal aus einer Halbleiterdiode erzeugt, um mit Hilfe einer aus
zwei Flipflops bestehenden Abtastschaltung Zufallsbits zu erzeugen, die einmalig aufgenommen und auf ein
geeignetes Speichermedium abgespeichert werden. Bei einer effektiven Generationsrate von 50 Kbit/s sind die
Abhängigkeiten der Bit untereinander so klein, dass sie nicht mehr nachgewiesen werden können.
Evelin Kofler
Zufallszahlen – first draft
Seite 4
→ link zu Excel-Lösung für „6 aus 45“ (zuger245.zip)
→ link zu C++-Lösung für „6 aus 45“
→ link zur Literaturliste von Dr. Richter
→ link zu zweigliedriger Markovkette
Evelin Kofler
Zufallszahlen – first draft
Seite 5
Zufallszahlen im Unterricht
Meine Schüler kommen erstmals in Kontakt mit dem Begriff der „Zufallszahl“, wenn sie folgende
Aufgabenstellung im Rahmen der Festigung der Kontrollstruktur IF-THEN-ELSE erhalten:
Zahlenraten(1): Der Benutzer versucht, eine vom System generierte Zufallszahl zu erraten. Das System teilt ihm
mit, ob er die Zahl erraten hat oder nicht.
Zur Generierung einer Zufallszahl stellt BorlandC die Funktion
random(Obergrenze);
⇒
liefert eine ganze Zahl x mit 0 <= x < Obergrenze
in der Bibliothek stdlib.h zur Verfügung stellt.
Zahlenraten(2): Erweitern Sie Zahlenraten(1) dahingehend, dass das System dem Benutzer mitteilt, ob sein Tipp
zu hoch oder zu niedrig gewesen ist.
Bei dieser Aufgabe stellen sich meist noch keine Fragen. Spätestens bei der Festigung der FOR-Schleife mit der
folgenden Aufgabe, welche auch zu einem späteren Zeitpunkt wieder aufgegriffen werden kann, wird der Begriff
der „Zufallszahl“ auch von den Schülern hinterfragt.
Lottosimulation(1): Erstellen Sie ein Programm, welches Ihnen mittels Zufallszahlengenerator einen Tipp für "6
aus 45" erstellt.
Evelin Kofler
Zufallszahlen – first draft
Seite 6
Lottosimulation(2): Erstellen Sie ein Programm, welches Ihnen mittels Zufallszahlengenerator drei Tipps für „6
aus 45“ erzeugt. Mittels Zufallszahlengenerator wird dann auch das Ergebnis einer Ziehung
simuliert.
Das Programm soll nun berechnen, wie viele Treffer Sie mit Ihren einzelnen Tipps erzielt
haben.
Setzen Sie dabei die Unterprogrammtechnik sinnvoll ein!
Bereits bei Lottosimulation(1) stellen die Schüler fest, dass sie den gleichen Tipp auf ihrem Bildschirm stehen
haben wie ihre Nachbarn. Auch bei einem neuerlichen Start des Programms ändert sich die Folge der
Zufallszahlen nicht. Diese Erkenntnis gibt Anlass dazu, zu Hinterfragen, was der Computer überhaupt unter
„Zufallszahlen“ versteht und wie sie generiert werden.
Die Schüler lernen dabei auch die Prozedur randomize(); (Bibliotheken: stdlib.h und time.h) kennen, welche vor
der Generierung der ersten Zufallszahl aufzurufen ist. Bei jedem Aufruf dieser Prozedur (also auch bei jedem
neuerlichen Programmstart) wird der Anfangswert (seed) für die Generierung der Zufallszahlen abhängig von der
Betriebssystemzeit neu wählt, wodurch sichergestellt wird, dass nicht bei jedem Programmstart die gleiche Folge
von Zufallszahlen erzeugt wird.
Ein Problem, welches der Befehl randomize(); nicht lösen kann, ist jenes, dass eine Zufallszahl mehr als einmal in
der generierten Zufallszahlenfolge auftauchen kann. Dieses Problem stellt eine gute Überleitung zur Einführung
der Datenstruktur Feld dar, da das Programm sich die bisher generierten Zahlen merken und bei Generierung einer
bereits existierenden Zahl diese verwerfen muss.
Evelin Kofler
Zufallszahlen – first draft
Seite 7
Kapitel 8 aus dem Turing-Omnibus: Random Numbers – The Chaitin-Kolmogoroff Theory
Das Wesen des Zufalls ist das Fehlen von Prozeduren und Mechanismen. Daher ist es fast ein Widerspruch,
Zufallszahlen und Computer im selben Atemzug zu erwähnen.
Wenn wir mittwochs oder samstags die Ziehung der Lottozahlen am Fernsehschirm mitverfolgen, stellen wir den
Zufall doch kaum in Frage, da nur die physikalischen Gesetze die Position der Bälle im Behälter bestimmen.
Zufallszahlengeneratoren der Programmiersprachen werden von ihren Benutzern auch kaum hinterfragt
(vergleiche Zahlenraten(1)). Sofern die generierten Zufallszahlen, die doch in mehreren Applikationen
Anwendung finden, zufällig wirken, wird ihre „Zufälligkeit“ auch nicht hinterfragt. Erst bei Implementierung der
Lottosimulation sind Bedenken aufgetreten.
Viele der in den modernen Rechnern eingebauten Generatoren verwenden die lineare kongruente Methode.
Hierbei wird (rekursiv) durch eine einfache Formel die nächste Zufallszahl anhand der aktuellen Zufallszahl
ermittelt:
x n +1 = (k ⋅ x n + c) mod m
Um den Prozess zu starten, wird ein Initialwert x0, seed genannt, gewählt. c wird offset genannt.
Nicht jede Kombination der Parameter k, c und m produziert Zahlen, die zufällig wirken:
z. B. erzeugt k = 19, c = 51, m = 100, x0 = 25 die Zahlenfolge
25, 26, 45, 6, 47, 44, 87, 4, 27, 64, 67, 24, 7, 84, 47, ...
Evelin Kofler
Zufallszahlen – first draft
Seite 8
Nachdem die verwendete Formel deterministisch ist, kann man leicht nachvollziehen, dass sich die
Zahlenfolge zwischen den beiden Werten 47 immer wieder wiederholen wird.
25, 26, 45, 6, 47, 44, 87, 4, 27, 64, 67, 24, 7, 84, 47, ...
Die Länge einer solchen Teilsequenz wird Periode genannt. Bei obiger Folge hat die Periode den Wert 10. Es
ist offensichtlich, dass sich jede Folge von Zahlen, die mit Hilfe dieser Methode generiert wird, sich früher
oder später wiederholen wird. Es erhebt sich nur die Frage, um wie viel besser man werden kann.
Die folgende Wahl der Parameter zeigt, dass man die Dinge etwas verbessern kann. Es zeigt aber auch, wie
sensibel der Generierungsprozess auf kleinste Parameteränderungen reagiert.
Ändern wir z. B. nur den Parameter m von 100 auf 101 ab, so erhalten wir die Zahlenfolge
25, 21, 46, 16, 52, 29, 97, 76, 81, 75, 62, 17, 71, 87, 88, 6, 64, 55, 86, 69, 49, 73, 24, 2, 89, 76, ...
Die Periode hat sich auf 18 vergrößert und beginnt auch um einiges später.
Noch mehr zufällige Zahlen können anscheinend durch die bestens bekannte logistische Formel, welche als
Illustration von Chaos in Dynamischen Systemen verwendet wird, erzeugt werden:
x n +1 = r ⋅ x n ⋅ (1 − x n )
Indem mit einem Startwert x0 begonnen wird, der zwischen 0 und 1 liegt, kann mit dieser Formel eine
überzeugend aussehende Folge von Zufallszahlen erzeugt werden. Der Startwert ist bei dieser Formel nicht
Evelin Kofler
Zufallszahlen – first draft
Seite 9
kritisch. Aber nach ein paar Iterationen wird die Folge der Zahlenwerte (übertrieben ausgedrückt) wie wild
geworden in einem Teilintervall [a, b]  [0, 1] hin und her hüpfen. Man kann dieses Übel aber beseitigen,
indem man auf xn die folgende Transformation anwendet, wodurch man eine neue „zufällige“ Zahl yn zwischen
0 und 1 erhält.
Die logistische Formel verhält sich nur für bestimmte Werte des Parameters r chaotisch. (→ 3.57 ≤ r ≤ 4)
Es wurden viele Theorien entwickelt, die sich mit der Zufälligkeit der von Zufallsgeneratoren erzeugten
Zufallszahlen beschäftigen. Aber da sie durch einen deterministischen Algorithmus erzeugt werden, können sie
immer nur sogenannte Pseudo-Zufallszahlen sein.
Eine dieser Theorien ist die von Gregory J. Chaitin und A. N. Kolmogoroff Mitte der Sechziger Jahre
unabhängig voneinander entwickelte Chaitin-Kolmogoroff Theory. Diese Theorie definiert die Zufälligkeit
einer endlichen Folge von Zahlen in Abhängigkeit von der Länge des kürzesten Programms, welche diese
Zahlenfolge generieren kann. Je länger dieses Programm sein muss, umso „zufälliger“ ist diese Zahlenfolge.
Offensichtlich braucht ein Programm, welches eine gegebene Zahlenfolge erzeugen soll, kaum länger als die
Folge selbst sein. Dies legt nahe, dass jene Folgen, welche Programme erfordern, die annähernd so lang sind
wie die Folge selbst, die „zufälligsten“ sind.
Beispiel: Welches ist das kürzeste Programm, das eine Zahlenfolge erzeugt, die aus m Wiederholungen der
Sequenz 01001 besteht?
Evelin Kofler
Zufallszahlen – first draft
Seite 10
Angenommen, wir verwenden folgende Pseudo-Programmiersprache,
for
i = 1 to m
output 0,1,0,0,1
so haben wir ein Programm, welches aus 23 ASCII-Zeichen (Blanks nicht mitgezählt) und einer
Variablen m besteht, die sich von einer Programmversion zur anderen ändern wird.
Für einen bestimmten Wert von m wird die Länge des vorliegenden Programms (in ASCII-Zeichen
gemessen) 23 + log m sein. Es erzeugt eine Zahlenfolge der Länge n = m·5 (5 ist die Periode, d.h.
Länge der Teilsequenz 01001).
Wie „zufällig“ ist nun die durch dieses Programm erzeugte Zahlenfolge? Eine Möglichkeit, die
Zufälligkeit zu messen, ist, das Verhältnis aus Programmlänge und Länge der Zahlenfolge zu
bilden:
r≤
23 + log m
5m
Für m → ∞ geht r gegen 0. Daraus kann man schließen, dass längere Zahlenfolgen immer weniger
„zufällig“ werden.
Das Problem bei dem ganzen ist, zu beweisen, dass es sich bei dem angegebenen Programm tatsächlich um das
kürzestmögliche handelt. Es ist unmöglich zu beweisen, dass eine bestimmte Folge zufällig ist, aber man kann
zeigen, dass die meisten Folgen zufällig sind. Aber darauf möchte ich hier nicht näher eingehen. Ich möchte
nur auf den berühmten Unvollständigkeitssatz von Gödel verweisen.
Evelin Kofler
Zufallszahlen – first draft
Seite 11