Zufallszahlen und Zufallsgeneratoren

Zufallszahlen und Zufallsgeneratoren

Etwas Theorie …

Zufallszahlen werden in der Informatik häufig benötigt. Sei es für zufällige Dateinamen temporärer Dateien, eindeutige IDs, generierte Passwörter, zeitversetzte Zugriffe auf Resourcen oder für Lottozahlen Generatoren und die Hoffnung auf fette Gewinne.

Wir sehen uns sowohl die Theorie der Algorithmen an, als auch die Praxis, wie Zufallszahlen in verschiedenen Programmiersprachen gezogen werden können.

Sind Zufallszahlen wirklich zufällig ?

Nein, meist nicht. Ausnahme bilden die nicht deterministische Zufallsgeneratoren.

Nicht deterministische physikalische Zufallsgeneratoren

Bei diesen Generatoren wird die Zufälligkeit physikalischer Ereignisse, wie z.B.: thermisches Rauschen oder radioaktive Zerfallsprozesse ausgenutzt.

Die Qualität der generierten Zahlen ist in der Regel sehr hoch der Aufwand dahinter allerdings auch. Für die Generierung wird eine spezielle Hardware benötigt.

Aus diesem Grund gehen die Software Entwickler meist andere Wege.

Deterministische Zufallsgeneratoren

Diese erzeugen keine „echten“ Zufallszahlen, sondern Zahlen die durch ausgefeilte Algorithmen zufällig erscheinen. Daher werden diese auch gerne Pseudo-Random Generatoren genannt.

Die Erzeugung geschieht recht flott, allerdings können die generierten „Zufallszahlen“ relativ einfach „vorhergesagt“ werden. Kennt man bereits einige Zahlen, so kann man unter Umständen die weitere Zahlenfolge „vorraussagen“.

Ein einfacher C++ Generator, der die Standard Funktion srand benutzt liefert beim ersten Durchlauf folgende Zahlen:

42 68 35 1 70 25 79 59 63 65

Beim zweiten Durchlauf werden diese Zahlen geliefert:

42 68 35 1 70 25 79 59 63 65

Zufällig sieht wohl anders aus. Aus diesem Grund muss immer ein Startwert, der Seed mitgegeben werden. Oft ist der Seed einfach der aktuelle Zeitstempel. Nun liefert der Generator scheinbare Zufallszahlen:

38 64 89 55 27 70 93 12 66 53

87 50 7 57 73 3 11 71 64 68

Für viele Einsatzbeispiele genügen diese Generatoren.

Die derzeitige Implementierung der  .net Random Klasse beruht auf einem Algorithmus von  Donald E. Knuth .

Prinzipiell funktioniert die Implementierung folgend:

Initialisierung:

  •  „Zufälliger“ Startwert wird bestimmt, default: TickCount
  •  SEED Tabelle ( Array ) wird berechnet ( Subtraktions Algorithmus )

 Zahlen ziehen:

  • Zwei Zahlen werden aus der SEED Tabelle entnommen.
  • Diese Zahlen werden miteinander verknüpft und ergeben nun die Zufallszahl.
  • Zufallszahl wird wieder als neuer Wert in die SEED Tabelle gespeichert.
  • Der Bereich wird prinzipiell folgend gelöst: Min + ( Max – Min ) * RND ( 0.0 – 1.0 ).

Daran erkennt man nun folgendes:

  • Die Initialisierung darf nur einmal geschehen, am besten beim Programmstart. Und sie kostet etwas Zeit.
  • Die gezogenen Zahlen sind pseudo-random Zahlen, die Ziehung geht dafür recht flott.

„Nicht Deterministische“ Generatoren

Wer es gerne etwas zufälliger haben möchte, kann auf die „nicht deterministischen“ Generatoren zurück greifen.

Ein Computerprogramm ist natürlich immer deterministisch. Daher müsste man auch bei diesen Generatoren den Begriff „Pseudo“ voran stellen. Zumindest werden die Zahlen hier einzeln berechnet und sind somit nicht direkt abhängig von der bestehenden Zahlenreihe. Dadurch sind diese Zahlen auch viel schwerer „vorraussagbar“ als die der deterministischen Generatoren.

In .net wurden ein solcher Generator in der  CryptoServiceProvider Class implementiert.

Nächstes Kapitel: Praxis

Immer auf dem Laufenden !
Liken Sie uns jetzt auf Facebook
Keinen Artikel verpassen !
Folgen Sie uns jetzt auf Twitter

Fanden Sie den Artikel interessant ? Dann empfehlen Sie ihn doch gleich weiter !

Sagen Sie uns Ihre Meinung !

Happy new year 2016 !
Happy New Year 2016 !
Google Tips
Die besten Google Tipps, Hacks, Games und Easter Eggs !
Registry Quiz
Sind Sie ein Windows Registry Experte ?
Coder Myths
14 hartnäckige Programmier(er) Mythen und Irrtümer
Password Sünden / Password Sins
13 gefährliche Passwort Sünden
Passwort Generator / password generator
Online Passwort Generator
Password Hacker
Passwort Hacker – Wie kommen Hacker an Ihre Passwörter ?
Leet
Leet – die Hacker Sprache
Spy++ Title
Windows Fenster Spionage mit Spy++
Registry Quiz
Sind Sie ein Windows Registry Experte ?
Title ProcMon
Prozess Monitor – Programmen auf die Finger geschaut !
Windows Construct
Fenster im Eigenbau !
Coder Myths
14 hartnäckige Programmier(er) Mythen und Irrtümer
Windows Construct
Fenster im Eigenbau !
Debug Messages
Programmierer Geflüster abhorchen
Registry timestamp / Registry Zeitstempel
Registry Keys haben einen Zeitstempel ?!
Title ProcMon
Prozess Monitor – Programmen auf die Finger geschaut !
WMI Code Creator
WMI Code Creator – WMI ganz komfortabel
Environment Variables / Umgebungs Variablen
Windows konfigurieren mit Umgebungsvariablen
Passwort Generator / password generator
Online Passwort Generator