Lineare Kongruenzgeneratoren sind Generatoren für Pseudozufallsfolgen der Form:
Die folgenden Werte sind konstant:
Um eine neue Zufallszahl zu erhalten, nimmt man die vorhergehende Zufallszahl, multipliziere sie mit einer Konstanten
Damit diese Methode sauber funktioniert sind bestimmte Regeln bei der Wahl von
Die letzte Bedingung scheint eigenartig, doch sie verhindert das Auftreten bestimmter, möglicherweise problematischer Fälle die durch mathematische Analyse gefunden wurden.
Die Periode des Generators beträgt höchstens
Das größte Problem des Generators besteht darin, daß er in
einen Zyklus gelangen kann und viel früher, als erwartet, Zahlen erzeugt,
die er bereits erzeugt hat. Dies ist zum Beispiel bei der Wahl von
Lineare Kongruenzgeneratoren können in der Kryptographie nicht benutzt werden, da sie vorhersagbar sind. Sie wurden zum erstem Mal von Jim Reeds geknackt.
Folgendes Programm schreibt eine Zufallszahlenfolge in eine Datei namens "test.dat":
// *****************************************************************
// Linearer Kongruenzgenerater
// Programm erzeugt eine Folge von Zufallszahlen mittels Linearer
// Kongruenz. Die Folge wird in einer Datei abgelegt.
// Autor: Martin Essig
// *****************************************************************
#include "iostream.h"
#include "fstream.h"
#define a 1291 // Multiplikator
#define b 4621 // Inkrement
#define m 21870 // Modul
#define m1 10000
#define start 1235 // Startwert (seed)
// Modulo-Multiplikation zur Verhinderung von Ueberlauf
// Eingabe : Die zu multiplizierenden Zahlen p,q
// Ergebnis : p * q
long mult(long p,long q)
{
long p1,p0,q1,q0;
p1 = p/m1; p0 = p%m1;
q1 = q/m1; q0 = q%m1;
return(((p0*q1+p1*q0) % m1)*m1+p0*q0) % m;
}
// Berechnet nächste Zufallszahl der Folge
// Eingabe : letzte Zufallszahl
// Ausgabe : nächste Zufallszahl
long random(long last)
{
long result;
result = (mult(last,a) + b) % m; // Generator
return result;
}
void main()
{
ofstream output;
long n,i;
long result,ausgabe;
result = start;
cout << "Anzahl: "; // Anzahl der Zufallszahlen, die berechnet werden
// sollen
cin >> n;
output.open("test.dat");
i = 0;
while (i < n)
{
result = random(result);
ausgabe = result & 255; // Ausgabe auf 8 bit gekuerzt
output << "\n" << ausgabe;
i++;
}
output.close();
}