www.wikidata.de-de.nina.az
Die Kongruenzgeneratoren bilden eine Klasse von Algorithmen die zufallig aussehende Zahlenfolgen erzeugen Die dadurch erzeugten Zahlen nennt man Pseudozufallszahlen da sie deterministisch erzeugt werden und somit nicht wirklich zufallig sind Kongruenzgeneratoren sind die bekanntesten und meistverwendeten rekursiven arithmetischen Zufallszahlengeneratoren Inhaltsverzeichnis 1 Allgemeiner Kongruenzgenerator 2 Linearer Kongruenzgenerator 2 1 Periodenlange 2 2 Mangel der erzeugten Zahlen 2 2 1 Teilperiode 2 2 2 Hyperebenen Verhalten 2 3 Programmierung 3 Fibonacci Generator 4 Verzogerter Fibonacci Generator 5 Andere 6 Siehe auch 7 Einzelnachweise 8 WeblinksAllgemeiner Kongruenzgenerator BearbeitenEin Kongruenzgenerator wird durch folgende Parameter definiert Anzahl n N displaystyle n in mathbb N nbsp der Zustandswerte Modul m 2 3 4 displaystyle m in 2 3 4 ldots nbsp Faktoren a 1 a n 0 m 1 displaystyle a 1 ldots a n in left 0 ldots m 1 right nbsp mit a n gt 0 displaystyle a n gt 0 nbsp Inkrement b 0 m 1 displaystyle b in left 0 ldots m 1 right nbsp Startwerte y 1 y n 0 m 1 displaystyle y 1 ldots y n in left 0 ldots m 1 right nbsp nicht alle 0 wenn b 0 displaystyle b 0 nbsp Fur i gt n displaystyle i gt n nbsp setzt man nun y i k 1 n a k y i k b mod m displaystyle y i left left sum k 1 n a k y i k right b right bmod m nbsp Dabei bezeichnet mod displaystyle mod nbsp den Divisionsrest siehe Modulo Die so berechneten y i displaystyle y i nbsp werden als Zufallszahlen verwendet Der Zustand des Generators vor der Erzeugung von y i displaystyle y i nbsp wird durch die Werte y i n y i 1 displaystyle y i n ldots y i 1 nbsp gegeben Dieser Zustand legt bei gegebenen n m a k b displaystyle n m a k b nbsp alle folgenden Zufallszahlen fest da die nachste Zufallszahl und der nachste Zustand durch den aktuellen Zustand determiniert werden Es gibt m n displaystyle m n nbsp mogliche Zustande und deshalb muss spatestens nach m n displaystyle m n nbsp Schritten ein fruherer Zustand wiederholt werden Der Kongruenzgenerator erzeugt somit eine periodische Folge von Zahlen wobei die Periodenlange auch wesentlich kleiner als m n displaystyle m n nbsp sein kann Im Extremfall ist sie 1 und der Generator erzeugt immer die gleiche Zufallszahl Bei der Festlegung der Parameter kommt es somit unter anderem darauf an eine ausreichende Periodenlange sicherzustellen Braucht man reelle Zufallszahlen im Intervall 0 1 displaystyle 0 1 nbsp so kann man dafur die Naherung u i y i m displaystyle u i frac y i m nbsp verwenden falls der Modulo m displaystyle m nbsp gross genug ist um eine ausreichend feine Unterteilung zu ergeben Linearer Kongruenzgenerator BearbeitenMit n 1 displaystyle n 1 nbsp erhalt man den Sonderfall eines linearen Kongruenzgenerators Bei b 0 displaystyle b 0 nbsp wird er als multiplikativer Kongruenzgenerator bezeichnet und fur andere b displaystyle b nbsp als gemischter linearer Kongruenzgenerator Letzterer wird haufiger verwendet und hat vier naturliche Zahlen als Parameter Modul m 2 3 4 displaystyle m in 2 3 4 ldots nbsp Faktor a 1 m 1 displaystyle a in 1 ldots m 1 nbsp Inkrement b 1 m 1 displaystyle b in 1 ldots m 1 nbsp Startwert y 1 0 m 1 displaystyle y 1 in 0 ldots m 1 nbsp Aus dem Startwert werden dann die weiteren Werte nach folgender Formel mit i 2 displaystyle i geq 2 nbsp berechnet y i a y i 1 b mod m displaystyle y i ay i 1 b bmod m nbsp Der lineare Kongruenzgenerator wurde 1949 von Derrick Henry Lehmer eingefuhrt 1 Er wird in den Laufzeitbibliotheken verschiedener Programmiersprachen zur Erzeugung von Pseudozufallszahlen verwendet z B in C C in der Funktion rand in der Headerdatei stdlib h 2 In der Kryptographie dagegen kommt der lineare Kongruenzgenerator nicht zum Einsatz da man schon aus wenigen Werten der erzeugten Zahlenfolge die Parameter a displaystyle a nbsp und b displaystyle b nbsp und damit die vollstandige Zahlenfolge berechnen kann Periodenlange Bearbeiten Lineare Kongruenzgeneratoren erreichen nach dem Satz von Knuth genau dann ihre maximal mogliche Periodenlange m displaystyle m nbsp wenn die folgenden Voraussetzungen erfullt sind Das Inkrement b displaystyle b nbsp ist zum Modul m displaystyle m nbsp teilerfremd Jeder Primfaktor von m displaystyle m nbsp teilt a 1 displaystyle a 1 nbsp Wenn m displaystyle m nbsp durch 4 teilbar ist dann auch a 1 displaystyle a 1 nbsp In diesem Fall erzeugt der Generator jede Zahl von 0 bis m 1 displaystyle m 1 nbsp genau einmal und beginnt dann wieder von vorn Er liefert also eine pseudozufallige Permutation dieser Zahlen Der Startwert y 1 displaystyle y 1 nbsp kann dann jede Zahl aus dieser Menge sein Der multiplikative Kongruenzgenerator mit b 0 displaystyle b 0 nbsp muss somit eine Periodenlange kleiner als m displaystyle m nbsp haben Der Satz von Carmichael besagt bei gegebenem m displaystyle m nbsp ist seine Periodenlange genau dann maximal wenn gilt y 1 displaystyle y 1 nbsp ist zu m displaystyle m nbsp teilerfremd a displaystyle a nbsp ist ein primitives Element modulo m displaystyle m nbsp Fur einige Sonderfalle von m displaystyle m nbsp konnen die primitiven Elemente modulo m displaystyle m nbsp leicht bestimmt werden Ist m displaystyle m nbsp eine Zweierpotenz 16 displaystyle geq 16 nbsp dann muss a displaystyle a nbsp mod 8 den Rest 3 oder 5 liefern Die Periodenlange ist dann m 4 displaystyle m 4 nbsp und der Startwert y 1 displaystyle y 1 nbsp muss ungerade sein Es gibt zwei Perioden die jeweils die Halfte der ungeraden Zahlen von 1 displaystyle 1 nbsp bis m 1 displaystyle m 1 nbsp umfassen Wenn m displaystyle m nbsp eine Primzahl 3 displaystyle geq 3 nbsp ist dann muss fur alle Primfaktoren q displaystyle q nbsp von m 1 displaystyle m 1 nbsp gelten a m 1 q mod m 1 displaystyle a m 1 q bmod m neq 1 nbsp Dann betragt die Periodenlange m 1 displaystyle m 1 nbsp Der Startwert y 1 displaystyle y 1 nbsp darf nicht Null sein Mangel der erzeugten Zahlen Bearbeiten Der lineare Kongruenzgenerator liefert keine vollkommen zufallig erscheinenden Zahlen Man kann nachweisen dass eine Abhangigkeit von aufeinanderfolgenden Zahlen besteht Teilperiode Bearbeiten Oft wahlt man m 2 e displaystyle m 2 e nbsp wobei e displaystyle e nbsp die Wortlange des Rechners in Bit ist denn dann muss man die Modulo Division nicht explizit berechnen Sie ergibt sich von selbst durch das Abschneiden der Uberlauf Bits In diesem Fall verhalten sich die x displaystyle x nbsp niederwertigsten Bits der Zustandszahl y i displaystyle y i nbsp wie ein Generator mit dem Modul 2 x displaystyle 2 x nbsp Diese Bits wiederholen sich also spatestens nach 2 x displaystyle 2 x nbsp Schritten Dies bedeutet insbesondere dass das niederwertigste Bit bestenfalls die Periode 2 besitzt also regelmassig zwischen 0 und 1 wechselt Beim multiplikativen Kongruenzgenerator ist es sogar konstant Allgemein gilt fur alle linearen Kongruenzgeneratoren wenn d displaystyle d nbsp ein Teiler des Moduls m displaystyle m nbsp ist dann ergibt y i mod d displaystyle y i bmod d nbsp eine Zahlenfolge mit der Periode o d displaystyle o leq d nbsp fur ein o 1 d displaystyle o in 1 ldots d nbsp gilt i y i o y i mod d displaystyle forall i y i o equiv y i bmod d nbsp Wenn der Generator nach dem Satz von Knuth die Periode m displaystyle m nbsp hat dann betragt die Lange o displaystyle o nbsp der Teilperiode genau d displaystyle d nbsp fur alle Teiler d displaystyle d nbsp von m displaystyle m nbsp Wegen dieses Teilperioden Verhaltens ist es ungunstig Zufallszahlen r i 0 k 1 displaystyle r i in 0 ldots k 1 nbsp durch r i y i mod k displaystyle r i y i bmod k nbsp zu gewinnen wenn k displaystyle k nbsp und m displaystyle m nbsp nicht teilerfremd sind Dann wurde der Divisionsrest r i mod d displaystyle r i bmod d nbsp fur eine Zahl d displaystyle d nbsp die k displaystyle k nbsp und m displaystyle m nbsp teilt eine Periode der Lange hochstens d displaystyle d nbsp durchlaufen Wenn man z B einen sechsseitigen Wurfel simulieren will und m displaystyle m nbsp gerade ist dann liefert r i y i mod 6 displaystyle r i y i bmod 6 nbsp Zahlen die abwechselnd gerade und ungerade sind Mogliche Abhilfe Man nutzt einen gemischten linearen Kongruenzgenerator mit Periode m displaystyle m nbsp wobei man den Modul m displaystyle m nbsp zu k displaystyle k nbsp teilerfremd wahlt Die Ergebnisse r i y i mod k displaystyle r i y i bmod k nbsp sind nicht gleichverteilt aber bei k m displaystyle k ll m nbsp ist die Abweichung von der Gleichverteilung nur gering und kann oft vernachlassigt werden Man nutzt einen multiplikativen Kongruenzgenerator mit Periode m 1 displaystyle m 1 nbsp und wahlt fur m displaystyle m nbsp eine grosse Primzahl Wenn ausserdem m 1 displaystyle m 1 nbsp ein Vielfaches von k displaystyle k nbsp ist sind die r i displaystyle r i nbsp auch gleichverteilt Man setzt m 2 e displaystyle m 2 e nbsp und wendet mit den hochstwertigen Bits von y i displaystyle y i nbsp eine Verwerfungsmethode an Die y i displaystyle y i nbsp werden um e f displaystyle e f nbsp Bit nach rechts geschoben wobei 2 f displaystyle 2 f nbsp die kleinste Zweierpotenz k displaystyle geq k nbsp ist r i y i 2 e f displaystyle r i lfloor y i 2 e f rfloor nbsp Dabei verwendet man nur die r i lt k displaystyle r i lt k nbsp die ubrigen werden verworfen Diese Methode liefert gleichverteilte Ergebnisse Man berechnet r i y i mod x displaystyle r i y i bmod x nbsp wobei x displaystyle x nbsp die kleinste zu m displaystyle m nbsp teilerfremde Zahl k displaystyle geq k nbsp ist und r i k displaystyle r i geq k nbsp werden verworfen Manche Implementierungen eines linearen Kongruenzgenerators umgehen das Problem indem sie nur den hoherwertigen Teil des Zustandswertes y i displaystyle y i nbsp als Ergebnis liefern Z B ist m 2 e displaystyle m 2 e nbsp und das dem Nutzer gelieferte Ergebnis ist y i 2 b displaystyle lfloor y i 2 b rfloor nbsp mit 2 b e displaystyle 2b e nbsp Hyperebenen Verhalten Bearbeiten nbsp Hyperebenenverhalten eines linearen Kongruenzgenerators in drei Dimensionen nbsp Gemischter Kongruenzgenerator x n 1 24298 x n 99991 mod 199017 displaystyle x n 1 24298x n 99991 bmod 199017 nbsp Dieser Generator wird im TI 59 von Texas Instruments verwendet Gezeigt werden uberlappende Tripel d h x 1 x 2 x 3 displaystyle x 1 x 2 x 3 nbsp x 2 x 3 x 4 displaystyle x 2 x 3 x 4 nbsp x 3 x 4 x 5 displaystyle x 3 x 4 x 5 nbsp etc Ohne Uberlappungen bliebe nur jede dritte Ebene ubrig Der lineare Kongruenzgenerator weist ein Hyperebenen Verhalten auf siehe Satz von Marsaglia Durch geeignete Wahl der Parameter m displaystyle m nbsp a displaystyle a nbsp und b displaystyle b nbsp kann man das Verhalten des Generators optimieren und eine grosse Zahl von Hyperebenen erreichen Bei gegebenem m displaystyle m nbsp kann man a displaystyle a nbsp nach folgenden Faustregeln bilden a displaystyle a nbsp sollte weder zu gross noch zu klein sein etwa 0 01 m lt a lt 0 99 m displaystyle 0 01 cdot m lt a lt 0 99 cdot m nbsp a displaystyle a nbsp sollte moglichst zufallig gewahlt werden also nicht in dualer oder dezimaler Darstellung eine runde Zahl sein Beim gemischten linearen Kongruenzgenerator sollte die Potency moglichst gross sein Sie ist der minimale Wert s displaystyle s nbsp fur den a 1 s displaystyle a 1 s nbsp ein Vielfaches von m displaystyle m nbsp ist Donald E Knuth empfiehlt dass die Potency mindestens 5 sein sollte Wenn m 2 e displaystyle m 2 e nbsp dann sollte a mod 8 5 displaystyle a bmod 8 5 nbsp sein um die maximal mogliche Potency e 2 displaystyle lceil e 2 rceil nbsp zu erhalten Wenn man sichergehen will dass der Generator gute Zufallszahlen erzeugt sollte man sich nicht allein auf diese Faustregeln verlassen sondern den Generator mit dem Spektraltest prufen Wegen des Hyperebenen Verhaltens greift man statt auf den linearen Kongruenzgenerator gelegentlich auf den inversen Kongruenzgenerator zuruck der dieses Problem nicht aufweist Allerdings erfordert er einen hoheren Rechenaufwand Er ist kein Spezialfall des allgemeinen Kongruenzgenerators Programmierung Bearbeiten Das folgende Programm in der Programmiersprache C implementiert einen linearen Kongruenzgenerator mit m 2 64 displaystyle m 2 64 nbsp a 6364136223846793005 displaystyle a 6364136223846793005 nbsp und b 2531011 displaystyle b 2531011 nbsp der nur die 32 hochstwertigen Bits jeder erzeugten Zufallszahl ausgibt und die niederwertigen die von geringerer Qualitat sind verwirft Das Programm erzeugt 10 Zufallszahlen die in einem Array gespeichert und anschliessend auf der Konsole ausgegeben werden 3 4 include lt iostream gt include lt stdint h gt using std cout using std endl Funktion die die Zufallszahlen erzeugt void linearCongruentialGenerator uint64 t amp y uint32 t randNumbers int count const uint64 t a 6364136223846793005 const uint64 t b 2531011 uint64 t r y lokale Variable fur die Berechnung for int i 0 i lt count i r a r b randNumbers i r gt gt 32 y r Zustand zuruckschreiben int main const int count 10 Anzahl der Zufallszahlen uint32 t randNumbers count Array fur die Zufallszahlen const uint64 t seed 12345 Startwert fur den Generator uint64 t y seed Zustand des Generators linearCongruentialGenerator y randNumbers count Erzeugung der Zufallszahlen for int i 0 i lt count i cout lt lt randNumbers i lt lt endl Ausgabe auf der Konsole Fibonacci Generator BearbeitenEin Fibonacci Generator ist ebenfalls ein Kongruenzgenerator mit n 2 displaystyle n 2 nbsp b 0 displaystyle b 0 nbsp und a 1 a 2 1 displaystyle a 1 a 2 1 nbsp und besteht aus folgenden Komponenten Modul m 2 3 4 displaystyle m in 2 3 4 dotsc nbsp Startwerte y 1 y 2 0 m 1 displaystyle y 1 y 2 in 0 dotsc m 1 nbsp Es sollte ggT m y 1 y 2 1 displaystyle operatorname ggT m y 1 y 2 1 nbsp sein Mit folgender Bildungsregel werden die Pseudozufallszahlen erzeugt y i y i 1 y i 2 mod m mit i 3 displaystyle y i y i 1 y i 2 bmod m quad text mit i geq 3 nbsp Eine Eigenschaft ist dass die Falle y i 1 lt y i 1 lt y i displaystyle y i 1 lt y i 1 lt y i nbsp bzw y i lt y i 1 lt y i 1 displaystyle y i lt y i 1 lt y i 1 nbsp nie auftreten Fibonacci Generatoren sind daher als Pseudozufallszahlengeneratoren wenig geeignet Das gilt insbesondere fur mathematische Objekte zu deren Erzeugung mehr als zwei Zufallszahlen erforderlich sind Wurde man beispielsweise damit versuchen eine zufallige Punktewolke in einem Wurfel zu generieren so kamen alle Punkte auf zwei Ebenen zu liegen Verzogerter Fibonacci Generator BearbeitenDas Prinzip des Fibonacci Generators kann aber verallgemeinert werden indem man nicht die beiden letzten sondern weiter zuruckliegende Zustandswerte y i displaystyle y i nbsp zur Erzeugung der neuen Zufallszahl verwendet Dies ergibt einen verzogerten engl lagged Fibonacci Generator y i y i B y i A mod m mit A B N A gt B i gt A displaystyle y i y i B y i A bmod m quad text mit A B in mathbb N A gt B quad i gt A nbsp mit den Startwerten y 1 y A 0 m 1 displaystyle y 1 dotsc y A in 0 dotsc m 1 nbsp Dann ist also n A displaystyle n A nbsp und a A a B 1 displaystyle a A a B 1 nbsp die ubrigen a k displaystyle a k nbsp sind Null Dabei wahlt man in der Regel m displaystyle m nbsp gerade und A displaystyle A nbsp und B displaystyle B nbsp so dass das Polynom in x displaystyle x nbsp x A x B 1 displaystyle x A x B 1 nbsp ein primitives Polynom modulo 2 ist Dann betragt die Periodenlange des Generators mindestens 2 A 1 displaystyle 2 A 1 nbsp Die folgende Tabelle gibt einige Wertepaare fur A displaystyle A nbsp und B displaystyle B nbsp an die diese Bedingung erfullen A 2 31 55 73 98 100 135 258 607 3217 23209B 1 13 24 25 27 37 22 83 273 576 9739x A x B 1 displaystyle x A x B 1 nbsp ist genau dann ein primitives Polynom modulo 2 wenn dies fur x A x A B 1 displaystyle x A x A B 1 nbsp gilt Somit kann man statt B displaystyle B nbsp immer auch A B displaystyle A B nbsp verwenden Dieser Generator wird auch praktisch eingesetzt Er liefert aber ebenfalls keine vollkommen zufallig erscheinenden Zahlen Das Problem des einfachen Fibonacci Generators wird nur verlagert Man hat niemals y i A lt y i lt y i B displaystyle y i A lt y i lt y i B nbsp oder y i B lt y i lt y i A displaystyle y i B lt y i lt y i A nbsp Ausserdem gibt es noch weitere Mangel Als Abhilfe wurde vorgeschlagen immer nur A displaystyle A nbsp aufeinanderfolgende Zahlen zu verwenden und dann die nachsten 4 A displaystyle 4A nbsp bis 10 A displaystyle 10A nbsp Zahlen zu verwerfen Dies funktioniert gut aber um den Preis eines 5 bis 11 mal hoheren Rechenaufwands Der von Donald Knuth vorgeschlagene Generator ranarray arbeitet auf diese Weise Bei ihm ist A 100 displaystyle A 100 nbsp und B 37 displaystyle B 37 nbsp und von 1009 aufeinanderfolgenden Zahlen wird immer nur ein Block von 100 Zahlen verwendet Um die Periode 2 A 1 displaystyle 2 A 1 nbsp sicherzustellen kommt es nur auf das jeweils niederwertigste Bit in den Zustandswerten y i displaystyle y i nbsp an also darauf ob sie gerade oder ungerade sind Man kann die hoherwertigen Bits beliebig modifizieren um die Qualitat der erhaltenen Zufallszahlen zu verbessern Beispielsweise y i y i A y i B f y i C mod m f 0 m 1 0 2 4 6 C 1 n displaystyle y i y i A y i B f y i C bmod m quad f colon 0 dotsc m 1 to 0 2 4 6 dotsc C in 1 dotsc n nbsp Andere BearbeitenMan kann den verzogerten Fibonacci Generator weiter verallgemeinern indem man mehr als zwei Zustandswerte verarbeitet y i k M y i k mod m mit M N displaystyle y i left sum k in M y i k right bmod m quad text mit quad M subset mathbb N nbsp n displaystyle n nbsp ist hier das grosste Element in M displaystyle M nbsp Um eine Periode von mindestens 2 n 1 displaystyle 2 n 1 nbsp zu garantieren muss auch hier das entsprechende Polynom k M x k 1 displaystyle sum k in M x k 1 nbsp oder gleichbedeutend das Polynom x n k M x n k displaystyle x n sum k in M x n k nbsp ein primitives Polynom modulo 2 sein mit geradem Modul m displaystyle m nbsp Ein so konstruierter Generator mit M gt 2 displaystyle M gt 2 nbsp liefert im Allgemeinen bessere Zufallszahlen als mit M 2 displaystyle M 2 nbsp aber wiederum um den Preis eines hoheren Rechenaufwands Mit einer weiteren Verallgemeinerung kann man bei gegebenem n displaystyle n nbsp die Periodenlange vergrossern und wohl auch die Qualitat der Zufallszahlen weiter verbessern p displaystyle p nbsp sei ein Primfaktor von m displaystyle m nbsp fur die Berechnungsvorschrift y i k 1 n a k y i k mod m displaystyle y i left sum k 1 n a k y i k right bmod m nbsp werden die a k 0 m 1 displaystyle a k in 0 dotsc m 1 nbsp derart gewahlt mit a n 0 mod p displaystyle a n not equiv 0 pmod p nbsp dass das Polynom in x displaystyle x nbsp x n k 1 n a k mod p x n k displaystyle x n sum k 1 n a k bmod p x n k nbsp ein primitives Polynom modulo p displaystyle p nbsp ist Dann betragt die Periodenlange mindestens p n 1 displaystyle p n 1 nbsp Der vorige Generator ergibt sich daraus mit p 2 displaystyle p 2 nbsp und a k 0 1 displaystyle a k in 0 1 nbsp als Sonderfall und n 1 p m displaystyle n 1 p m nbsp liefert einen multiplikativen Kongruenzgenerator mit der Periodenlange p 1 displaystyle p 1 nbsp Das Polynom f x x n k 1 n a k x n k displaystyle f x x n sum k 1 n a k x n k nbsp ist ein primitives Polynom modulo p displaystyle p nbsp wenn die folgenden Bedingungen erfullt sind sei r p n 1 p 1 und a 1 n 1 a n displaystyle text sei r frac p n 1 p 1 text und a 1 n 1 a n nbsp a displaystyle a nbsp ist ein primitives Element modulo p displaystyle p nbsp das Polynom x r displaystyle x r nbsp ist kongruent zu a displaystyle a nbsp modulo f x displaystyle f x nbsp fur alle Primfaktoren q displaystyle q nbsp von r displaystyle r nbsp ist der Grad des Polynoms x r q mod f x displaystyle x r q bmod f x nbsp positivDabei wird Polynomarithmetik angewandt siehe Polynome sowie Polynomdivision und mit den Koeffizienten wird modulo p displaystyle p nbsp gerechnet sie sind Elemente des Restklassenrings Z p Z displaystyle mathbb Z p mathbb Z nbsp Siehe auch BearbeitenListe von ZufallszahlengeneratorenEinzelnachweise Bearbeiten Donald E Knuth The Art of Computer Programming Volume 2 Seminumerical Algorithms 3 Auflage Addison Wesley 1997 ISBN 0 201 89684 2 S 10 26 Stackoverflow Forum Understanding the algorithm of Visual C s rand function Rosetta Code Linear congruential generator GeeksforGeeks Linear Congruence method for generating Pseudo Random NumbersWeblinks BearbeitenAbhandlung uber Bitstrom Verschlusselungen Abgerufen von https de wikipedia org w index php title Kongruenzgenerator amp oldid 214494984