www.wikidata.de-de.nina.az
Die Xorshift Generatoren bilden eine Klasse moderner Pseudozufallszahlengeneratoren Durch geringe Anforderungen an Speicher und Prozessor sind sie auch fur den Einsatz auf Systemen mit geringen Ressourcen z B Eingebettete Systeme geeignet Vorgestellt wurde der Xorshift Generator im Jahr 2003 von seinem Entwickler George Marsaglia 1 Inhaltsverzeichnis 1 Eigenschaften 2 Theorie 3 Initialisierung 4 Implementierung 5 Vergleich mit der rand Funktion aus Libc 6 Vergleich mit Mersenne Twister 7 Varianten 7 1 Xorwow 7 2 Xorshift 7 3 Xorshift 7 4 Xoroshiro und Xoshiro 8 Siehe auch 9 Literatur 10 EinzelnachweiseEigenschaften Bearbeiteneinfach benutzt ausschliesslich die Bit Operationen Shift und XOR geringer Speicherbedarf gerade so viel wie fur die gewunschte Periodenlange aus Prinzip notig ist s u skalierbar die Zahl der Zustandsworter ist frei wahlbar um die gewunschte Periodenlange zu erhalten schnell mit nur sechs bis sieben Bit Operationen wird ein Wort generiert nur fur kleinere Mengen von Zufallszahlen geeignet scheitert an einigen statistischen Tests der TestU01 Suite 2 3 nicht kryptographisch sicher da der interne Zustand offen liegt Theorie BearbeitenDer Zustand des Generators ist ein Bitvektor b 0 1 n displaystyle b in 0 1 n nbsp mit n displaystyle n nbsp Bit der zur Berechnung des nachsten Zustandes mit einer binaren n n Matrix multipliziert wird Mit den Elementen wird dabei modulo 2 gerechnet im Korper GF 2 Die Addition von Elementen Bits wird dabei zur XOR Verknupfung und die Multiplikation zur UND Verknupfung Die Periodenlange des Generators betragt 2 n 1 displaystyle 2 n 1 nbsp wenn b displaystyle b nbsp mit einem von Null verschiedenen Wert initialisiert und die Matrix geeignet gewahlt wird Dies wird mit genau den Matrizen erreicht die in der Allgemeinen linearen Gruppe GL n 2 der Gruppe der invertierbaren binaren n n Matrizen mit der Multiplikation die Elementordnung 2 n 1 displaystyle 2 n 1 nbsp haben Die Matrix wird ausserdem so konstruiert dass sich die Multiplikation mit dem Zustandsvektor einfach und effizient mit wenigen Maschinenoperationen Bitverschiebung displaystyle ll nbsp displaystyle gg nbsp und bitweise XOR Verknupfung displaystyle oplus nbsp ausfuhren lasst Die Entwickler gingen von solchen Darstellungen in Maschinenoperationen aus und pruften ob die dadurch definierte Multiplikationsmatrix die Elementordnung 2 n 1 displaystyle 2 n 1 nbsp hat Es zeigte sich wenn b displaystyle b nbsp ein Computerwort mit n 32 displaystyle n 32 nbsp oder n 64 displaystyle n 64 nbsp Bit ist dann entsprechen die drei aufeinanderfolgenden Operationen b b b u displaystyle b leftarrow b oplus b ll u nbsp b b b v displaystyle b leftarrow b oplus b gg v nbsp b b b w displaystyle b leftarrow b oplus b ll w nbsp einer Multiplikation mit einer Matrix der Ordnung 2 n 1 displaystyle 2 n 1 nbsp wenn die konstanten Schiebeweiten u v w displaystyle u v w nbsp geeignet gewahlt werden Um langere Perioden als 2 64 1 displaystyle 2 64 1 nbsp zu erhalten kann man den Zustand des Generators auch mit mehreren Wortern darstellen h b i a b i a u displaystyle h leftarrow b i a oplus b i a ll u nbsp b i h h v b i 1 b i 1 w i a a 1 displaystyle b i leftarrow h oplus h gg v oplus b i 1 oplus b i 1 gg w quad i a a 1 dots nbsp Der Zustand dieses Generators ist durch die a displaystyle a nbsp Worter b i a b i 1 displaystyle b i a dots b i 1 nbsp gegeben b 0 displaystyle b 0 nbsp bis b a 1 displaystyle b a 1 nbsp sind die Saatwerte Wenn e displaystyle e nbsp die Wortlange ist enthalt der Zustand somit n a e displaystyle n ae nbsp Bit Es werden wiederum u v w displaystyle u v w nbsp so gewahlt dass obige Operationen eine Multiplikation des Zustandsvektors mit einer n n Matrix der Elementordnung 2 n 1 displaystyle 2 n 1 nbsp entsprechen welche den nachsten Zustand b i a 1 b i displaystyle b i a 1 dots b i nbsp ergibt Nach jedem solchen Rechenschritt wird b i displaystyle b i nbsp als Ergebnis ausgegeben und i displaystyle i nbsp inkrementiert Man erhalt in der Regel bessere Zufallszahlen wenn man statt b i displaystyle b i nbsp eine etwas komplexere Funktion des Zustands b i a 1 b i displaystyle b i a 1 dots b i nbsp ausgibt zum Beispiel c b i displaystyle c cdot b i nbsp mit einem ungeraden konstanten Multiplikator c displaystyle c nbsp oder b i b i 1 displaystyle b i b i 1 nbsp 1 Initialisierung BearbeitenDer Anfangszustand des Generators darf nicht Null sein mindestens eines der n displaystyle n nbsp Zustandsbits muss den Wert 1 haben Ansonsten erhalt man einen Generator der Periodenlange 1 der immer nur 0 ausgibt da nur durch Shift und XOR Operationen aus einer Serie von 0 niemals eine 1 hervorgehen kann Von schlechter Initialisierung d h nur wenige 1 Bits im Zustandsvektor erholt sich der Xorshift relativ schnell dank seines in der Regel kleinen Zustandsvektors Die Wahrscheinlichkeit spater zufallig auf solche Zustande zu stossen ist wegen der geringen Zahl dieser Zustande im Vergleich zur Periodenlange vernachlassigbar Implementierung Bearbeitenuint32 t x32 314159265 uint32 t xorshift32 x32 x32 lt lt 13 x32 x32 gt gt 17 x32 x32 lt lt 5 return x32 uint64 t x64 88172645463325252ull uint64 t xorshift64 x64 x64 lt lt 13 x64 x64 gt gt 7 x64 x64 lt lt 17 return x64 uint32 t x 123456789 uint32 t y 362436069 uint32 t z 521288629 uint32 t w 88675123 uint32 t xorshift128 uint32 t t x x lt lt 11 x y y z z w w w gt gt 19 t t gt gt 8 return w Vergleich mit der rand Funktion aus Libc BearbeitenDie unter C und C standardmassig verfugbare Funktion rand ist unter Linux Glibc und Windows als linearer Kongruenzgenerator implementiert und liefert eine Sequenz die nicht einmal die einfachsten statistischen Tests besteht Es ist somit von der Verwendung abzuraten Ein Xorshift RNG in der oben dargestellten Form ist mit lediglich funf Variablen eine schnell implementierte Alternative die jedoch auch einige statistische Tests nicht besteht Vergleich mit Mersenne Twister BearbeitenDer Xorshift Generator ist dem Mersenne Twister zumindest ebenburtig wenn nicht sogar uberlegen Die generierten Bitsequenzen sind in beiden Fallen pseudozufallig und gleichverteilt jedoch besteht der Mersenne Twister nahezu alle stochastischen Tests Der Speicherbedarf fur den Zustandsvektor ist erheblich geringer hier 16 Bytes statt 2496 Bytes Auch ist der Xorshift Generator knapp 60 schneller Bei schlechter Initialisierung d h nur ein gesetztes Bit im Zustandsvektor benotigt der Xorshift weniger als 10 Schritte bis er wieder eine gleichverteilte Bit Sequenz liefert Der Mersenne Twister benotigt hierzu fast 800 000 Schritte was auch an dem grosseren Zustandsvektor liegt 4 Der Xorshift RNG hat mit 2128 1 eine kurzere Periodenlange als der Mersenne Twister mit 219937 1 Die nochmals deutlich grossere Periodenlange des Mersenne Twisters liefert jedoch nicht wirklich eine Aussage uber die Gute eines Zufallszahlengenerators Eine langere Periode bedeutet nicht gleichzeitig eine hohere Gute oder im Ergebnis eine bessere Statistik Daruber hinaus existieren andere moderne Generatoren mit noch langeren Perioden bis zu 2131086 1039461 und teils uberlegenen Eigenschaften vgl CMWC und WELL Varianten BearbeitenXorshift versagt bei einigen Tests der BigCrush Test Suite TestU01 Das gilt fur alle Generatoren die auf linearen Operationen basieren wie auch Mersenne Twister oder WELL Es ist jedoch leicht deren Ausgaben zu verwurfeln um ihre Qualitat zu verbessern Xorwow Bearbeiten Marsaglia schlug vor die Periodenlange zu vergrossern indem Xorshift mit einem einfachen Zahler modulo 232 kombiniert wird was er als Weyl Sequenz bezeichnet nach dem Gleichverteilungssatz von Weyl die Folge a i mod 1 i N displaystyle a cdot i bmod 1 i in mathbb N nbsp mit irrationalem a displaystyle a nbsp ist im Intervall 0 1 displaystyle 0 1 nbsp gleichverteilt Dieser Generator hat eine Periodenlange von 2 128 1 2 32 displaystyle 2 128 1 cdot 2 32 nbsp die ersten vier Worter von state durfen nicht komplett mit 0 initialisiert werden uint32 t xorwow uint32 t state static 5 Algorithmus xorwow von S 5 in Marsaglia Xorshift RNGs uint32 t s t state 3 t t gt gt 2 t t lt lt 1 state 3 state 2 state 2 state 1 state 1 s state 0 t s t s lt lt 4 state 0 t return t state 4 362437 Xorwow ist schnell aber besteht einige Tests aus BigCrush nicht 5 Er ist der Standardgenerator in Nvidias CUDA 6 Xorshift Bearbeiten Xorshift entsteht aus einem normalen Xorshift indem man die Ausgabe mit einer Konstanten modulo 2 32 displaystyle 2 32 nbsp bzw 2 64 displaystyle 2 64 nbsp multipliziert von Marsaglia vorgeschlagen 1 Der folgende Generator mit 64 Zustandsbits hat die Periodenlange 2 64 1 displaystyle 2 64 1 nbsp 7 und versagt nur beim MatrixRank Test aus BigCrush include lt stdint h gt uint64 t xorshift64star uint64 t amp state uint64 t x state state nicht mit 0 initialisieren x x gt gt 12 a x x lt lt 25 b x x gt gt 27 c state x return x 0x2545F4914F6CDD1D Ein ahnlicher Generator wird in Numerical Recipes als RanQ1 vorgeschlagen 8 er versagt aber ebenfalls beim BirthdaySpacings Test Wenn man Xorshift nur die 32 hochstwertigen Bits des Ergebnisses ausgeben lasst besteht er BigCrush ohne Fehler Dabei besteht noch eine Sicherheitsreserve da diese Tests auch schon von einer Version des Generators mit nur 40 Zustandsbits bestanden werden 9 Vigna 7 schlagt folgenden Xorshift1024 vor mit 1024 Zustandsbits und einer Periodenlange von 2 1024 1 displaystyle 2 1024 1 nbsp der BigCrush besteht include lt stdint h gt static uint64 t s 16 nicht komplett mit 0 initialisieren static int p uint64 t xorshift1024star void const uint64 t s0 s p uint64 t s1 s p amp 15 s1 s1 lt lt 31 a s1 s1 gt gt 11 b s1 s0 s0 gt gt 30 c s p s1 return s1 uint64 t 1181783497276652981 Xorshift Bearbeiten Statt der Multiplikation kann man auch die in der Regel schnellere Addition als nichtlineare Transformation einsetzen Diese Idee wurde zuerst von Saito und Matsumoto von denen auch der Mersenne Twister stammt vorgeschlagen und zwar im XSadd Generator der zwei aufeinanderfolgende Ausgaben eines zugrundeliegenden Xorshift addiert 10 XSadd hat Schwachen in den niederwertigen Ausgabebits und fallt bei einigen BigCrush Tests durch wenn man die Ausgabeworter invertiert also die niederwertigsten Bits an die hochste Stelle setzt und umgekehrt Als Abhilfe hat Vigna 11 die Xorshift Familie konstruiert die mit 64 Bit Wortern arbeiten nachfolgender Xorshift128 nutzt 128 Zustandsbits und hat eine Periodenlange von 2 128 1 displaystyle 2 128 1 nbsp Er besteht BigCrush auch bei Invertierung include lt stdint h gt uint64 t s 2 nicht komplett mit 0 initialisieren uint64 t xorshift128plus void uint64 t x s 0 uint64 t const y s 1 s 0 y x x lt lt 23 a s 1 x y x gt gt 17 y gt gt 26 b c return s 1 y Es ist einer der schnellsten Generatoren die BigCrush bestehen 12 Ein Nachteil der Addition von aufeinanderfolgenden Ausgabewortern ist dass der Generator so nur noch in einer Dimension gleichverteilt ist obwohl dies fur den zugrundeliegenden Xorshift in 2 Dimensionen gilt 11 Xoroshiro und Xoshiro Bearbeiten Diese von Sebastiano Vigna und David Blackman entwickelten Generatoren basieren auf der gleichen Theorie wie Xorshift 13 Sie enthalten jedoch auch die Bitrotation als elementare Operation Nachfolgende Versionen haben eine Periodenlange von 2 128 1 displaystyle 2 128 1 nbsp 14 include lt stdint h gt inline uint64 t rotl uint64 t a int w return a lt lt w a gt gt 64 w uint64 t xoroshiro128plus void static uint64 t s0 1451815097307991481 static uint64 t s1 5520930533486498032 auch hier wieder nicht beide mit 0 initialisieren const uint64 t result s0 s1 s1 s0 s0 rotl s0 55 s1 s1 lt lt 14 s1 rotl s1 36 return result uint64 t xoroshiro128starstar void static uint64 t s0 1321861022983091513 static uint64 t s1 3123198108391880477 auch hier wieder nicht beide mit 0 initialisieren const uint64 t result rotl s0 5 7 9 s1 s0 s0 rotl s0 24 s1 s1 lt lt 16 s1 rotl s1 37 return result Xoshiro ist die weiterentwickelte Variante die nochmals bessere Zufallszahlen erzeugt und eine Periodenlange von 2 256 1 displaystyle 2 256 1 nbsp aufweist 15 include lt stdint h gt inline uint64 t rotl uint64 t a int w return a lt lt w a gt gt 64 w uint64 t xoshiro256 void static uint64 t s0 1321861022983091513 static uint64 t s1 3123198108391880477 nicht alle vier mit 0 initialisieren static uint64 t s2 1451815097307991481 static uint64 t s3 5520930533486498032 const uint64 t result s0 s3 alternativ result rotl s1 5 7 9 const uint64 t t s1 lt lt 17 s2 s0 s3 s1 s1 s2 s0 s3 s2 t s3 rotl s3 45 return result Siehe auch BearbeitenListe von ZufallszahlengeneratorenLiteratur BearbeitenG Marsaglia Random number generators PDF In Journal of Modern Applied Statistical Methods Vol 2 2003 S 2 13 G Marsaglia On the randomness of Pi and other decimal expansions Memento vom 20 Juli 2011 im Internet Archive PDF Interstat Oktober 2005 5Einzelnachweise Bearbeiten a b c George Marsaglia Xorshift RNGs Bibliothek mit statistischen Tests TestU01 Pierre L Ecuyer Richard Simard TestU01 ACM Paper S 29 F Panneton P L Ecuyer Improved Long Period Generators Base on Linear Recurrences Modulo 2 PDF 301 kB Fabien Le Floc h XORWOW L ecuyer TestU01 Results In Chase The Devil blog 12 Januar 2011 abgerufen am 2 November 2017 cuRAND Testing Nvidia abgerufen am 2 November 2017 a b Xorshift An experimental exploration of Marsaglia s xorshift generators scrambled Buch Numerical Recipes The Art of Scientific Computing Press Teukolsky Vetterling Flannery 2007 Cambridge University Press Kapitel 7 1 2 A 64 bit Xorshift Method PCG A Family of Simple Fast Space Efficient Statistically Good Algorithms for Random Number Generation XORSHIFT ADD XSadd A variant of XORSHIFT a b Xorshift Generatoren Further scramblings of Marsaglia s xorshift generators xorshift xorshift generators and the PRNG shootout David Blackman Sebastiano Vigna Scrambled Linear Pseudorandom Generators 2018 abgerufen am 14 April 2018 David Blackman Sebastiano Vigna Original C source code implementation of Xoroshiro128 2016 abgerufen am 21 Juli 2017 http xoshiro di unimi it Abgerufen von https de wikipedia org w index php title Xorshift amp oldid 235838577