<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Xorshift</id>
	<title>Xorshift - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Xorshift"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Xorshift&amp;action=history"/>
	<updated>2026-06-01T18:47:35Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Xorshift&amp;diff=2244898&amp;oldid=prev</id>
		<title>imported&gt;Georg-Johann: /* Einzelnachweise */ TestU01 Weblink aktualisiert</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Xorshift&amp;diff=2244898&amp;oldid=prev"/>
		<updated>2025-12-17T10:42:01Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Einzelnachweise: &lt;/span&gt; TestU01 Weblink aktualisiert&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Die &amp;#039;&amp;#039;&amp;#039;Xorshift&amp;#039;&amp;#039;&amp;#039;-Generatoren bilden eine Klasse moderner [[Pseudozufallszahlengenerator]]en. Durch geringe Anforderungen an Speicher und Prozessor sind sie auch für den Einsatz auf Systemen mit geringen Ressourcen, z.&amp;amp;nbsp;B. [[Eingebettetes System|Eingebettete Systeme]], geeignet. Vorgestellt wurde der Xorshift-Generator im Jahr 2003 von seinem Entwickler [[George Marsaglia]].&amp;lt;ref name=&amp;quot;xorshift_paper&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
* einfach: benutzt ausschließlich die [[Bitweiser Operator|Bit-Operationen]] Shift und XOR;&lt;br /&gt;
* geringer Speicherbedarf: gerade so viel, wie für die gewünschte Periodenlänge aus Prinzip nötig ist (s.&amp;amp;nbsp;u.);&lt;br /&gt;
* skalierbar: die Zahl der Zustandswörter ist frei wählbar, um die gewünschte Periodenlänge zu erhalten;&lt;br /&gt;
* schnell: mit nur sechs bis sieben Bit-Operationen wird ein [[Datenwort|Wort]] generiert;&lt;br /&gt;
* nur für kleinere Mengen von Zufallszahlen geeignet: scheitert an einigen statistischen Tests der TestU01-Suite&amp;lt;ref name=&amp;quot;testu01&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;testu01_paper&amp;quot;&amp;gt;Pierre L’Ecuyer, Richard Simard: [http://dl.acm.org/citation.cfm?doid=1268776.1268777 TestU01 ACM Paper], S. 29&amp;lt;/ref&amp;gt;&lt;br /&gt;
* nicht [[Kryptographisch sicherer Zufallszahlengenerator|kryptographisch sicher]], da der interne Zustand offen liegt.&lt;br /&gt;
&lt;br /&gt;
== Theorie ==&lt;br /&gt;
Der Zustand des Generators ist ein Bitvektor &amp;lt;math&amp;gt;b \in \{0,1\}^n&amp;lt;/math&amp;gt; mit &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; [[Bit]], der zur Berechnung des nächsten Zustandes mit einer binären n×n [[Matrix (Mathematik)|Matrix]] multipliziert wird. Mit den Elementen wird dabei [[Division mit Rest#Modulo|modulo]] 2 gerechnet im [[Endlicher Körper#Beispiel: Der Körper mit 2 Elementen|Körper GF(2)]]. Die Addition von Elementen (Bits) wird dabei zur XOR-Verknüpfung und die Multiplikation zur UND-Verknüpfung. Die [[Periodische Funktion|Periodenlänge]] des Generators beträgt &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;, wenn &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; mit einem von Null verschiedenen Wert initialisiert und die Matrix geeignet gewählt wird. Dies wird mit genau den Matrizen erreicht, die in der [[Allgemeine lineare Gruppe|Allgemeinen linearen Gruppe GL(n,2)]] (der [[Gruppe (Mathematik)|Gruppe]] der [[Reguläre Matrix|invertierbaren]] binären n×n Matrizen mit der [[Matrizenmultiplikation|Multiplikation]]) die [[Ordnung eines Gruppenelements|Elementordnung]] &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt; haben.&lt;br /&gt;
&lt;br /&gt;
Die Matrix wird außerdem so konstruiert, dass sich die Multiplikation mit dem Zustandsvektor einfach und effizient mit wenigen Maschinenoperationen ([[Schieberegister|Bitverschiebung]] &amp;lt;math&amp;gt;\ll&amp;lt;/math&amp;gt;, &amp;lt;math&amp;gt;\gg&amp;lt;/math&amp;gt; und bitweise [[Kontravalenz|XOR-Verknüpfung]] &amp;lt;math&amp;gt;\oplus&amp;lt;/math&amp;gt;) ausführen lässt. Die Entwickler gingen von solchen Darstellungen in Maschinenoperationen aus und prüften, ob die dadurch definierte Multiplikationsmatrix die Elementordnung &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt; hat.&lt;br /&gt;
&lt;br /&gt;
Es zeigte sich: wenn &amp;lt;math&amp;gt;b&amp;lt;/math&amp;gt; ein Computerwort mit &amp;lt;math&amp;gt;n=32&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;n=64&amp;lt;/math&amp;gt; Bit ist, dann entsprechen die drei aufeinanderfolgenden Operationen&lt;br /&gt;
:&amp;lt;math&amp;gt;b \leftarrow b \oplus (b \ll u)&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;b \leftarrow b \oplus (b \gg v)&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;b \leftarrow b \oplus (b \ll w)&amp;lt;/math&amp;gt;&lt;br /&gt;
einer Multiplikation mit einer Matrix der Ordnung &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt;, wenn die konstanten Schiebeweiten &amp;lt;math&amp;gt;u, v, w&amp;lt;/math&amp;gt; geeignet gewählt werden.&lt;br /&gt;
&lt;br /&gt;
Um längere Perioden als &amp;lt;math&amp;gt;2^{64}-1&amp;lt;/math&amp;gt; zu erhalten, kann man den Zustand des Generators auch mit mehreren Wörtern darstellen:&lt;br /&gt;
:&amp;lt;math&amp;gt;h \leftarrow b_{i-a} \oplus (b_{i-a} \ll u);&amp;lt;/math&amp;gt;&lt;br /&gt;
:&amp;lt;math&amp;gt;b_i \leftarrow h \oplus (h \gg v) \oplus b_{i-1} \oplus (b_{i-1} \gg w); \quad i=a,a+1,\dots&amp;lt;/math&amp;gt;&lt;br /&gt;
Der Zustand dieses Generators ist durch die &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; Wörter &amp;lt;math&amp;gt;b_{i-a},\dots,b_{i-1}&amp;lt;/math&amp;gt; gegeben (&amp;lt;math&amp;gt;b_0&amp;lt;/math&amp;gt; bis &amp;lt;math&amp;gt;b_{a-1}&amp;lt;/math&amp;gt; sind die Saatwerte). Wenn &amp;lt;math&amp;gt;e&amp;lt;/math&amp;gt; die Wortlänge ist, enthält der Zustand somit &amp;lt;math&amp;gt;n = ae&amp;lt;/math&amp;gt; Bit. Es werden wiederum &amp;lt;math&amp;gt;u, v, w&amp;lt;/math&amp;gt; so gewählt, dass obige Operationen eine Multiplikation des Zustandsvektors mit einer n×n-Matrix der Elementordnung &amp;lt;math&amp;gt;2^n-1&amp;lt;/math&amp;gt; entsprechen, welche den nächsten Zustand &amp;lt;math&amp;gt;b_{i-a+1},\dots,b_i&amp;lt;/math&amp;gt; ergibt. Nach jedem solchen Rechenschritt wird &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; als Ergebnis ausgegeben und &amp;lt;math&amp;gt;i&amp;lt;/math&amp;gt; inkrementiert.&lt;br /&gt;
&lt;br /&gt;
Man erhält in der Regel bessere Zufallszahlen, wenn man statt &amp;lt;math&amp;gt;b_i&amp;lt;/math&amp;gt; eine etwas komplexere Funktion des Zustands &amp;lt;math&amp;gt;b_{i-a+1},\dots,b_i&amp;lt;/math&amp;gt; ausgibt, zum Beispiel &amp;lt;math&amp;gt;c \cdot b_i&amp;lt;/math&amp;gt; mit einem ungeraden konstanten Multiplikator &amp;lt;math&amp;gt;c&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;b_i + b_{i-1}&amp;lt;/math&amp;gt;.&amp;lt;ref name=&amp;quot;xorshift_paper&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Initialisierung ==&lt;br /&gt;
Der Anfangszustand des Generators darf nicht Null sein; mindestens eines der &amp;lt;math&amp;gt;n&amp;lt;/math&amp;gt; Zustandsbits muss den Wert 1 haben. Ansonsten erhält man einen Generator der Periodenlänge 1, der immer nur 0 ausgibt, da nur durch Shift- und XOR-Operationen aus einer Serie von „0“ niemals eine „1“ hervorgehen kann.&lt;br /&gt;
&lt;br /&gt;
Von schlechter Initialisierung, d.&amp;amp;nbsp;h. nur wenige 1-Bits im Zustandsvektor, erholt sich der &amp;#039;&amp;#039;Xorshift&amp;#039;&amp;#039; relativ schnell dank seines (in der Regel) kleinen Zustandsvektors. Die Wahrscheinlichkeit, später zufällig auf solche Zustände zu stoßen, ist wegen der geringen Zahl dieser Zustände im Vergleich zur Periodenlänge vernachlässigbar.&lt;br /&gt;
&lt;br /&gt;
== Implementierung ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
uint32_t x32 = 314159265;&lt;br /&gt;
uint32_t xorshift32()&lt;br /&gt;
{&lt;br /&gt;
    x32 ^= x32 &amp;lt;&amp;lt; 13;&lt;br /&gt;
    x32 ^= x32 &amp;gt;&amp;gt; 17;&lt;br /&gt;
    x32 ^= x32 &amp;lt;&amp;lt; 5;&lt;br /&gt;
    return x32;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint64_t x64 = 88172645463325252ul;&lt;br /&gt;
uint64_t xorshift64()&lt;br /&gt;
{&lt;br /&gt;
    x64 ^= x64 &amp;lt;&amp;lt; 13;&lt;br /&gt;
    x64 ^= x64 &amp;gt;&amp;gt; 7;&lt;br /&gt;
    x64 ^= x64 &amp;lt;&amp;lt; 17;&lt;br /&gt;
    return x64;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint32_t x = 123456789;&lt;br /&gt;
uint32_t y = 362436069;&lt;br /&gt;
uint32_t z = 521288629;&lt;br /&gt;
uint32_t w = 88675123;&lt;br /&gt;
uint32_t xorshift128()&lt;br /&gt;
{&lt;br /&gt;
    uint32_t t = x ^ (x &amp;lt;&amp;lt; 11);&lt;br /&gt;
    x = y; y = z; z = w;&lt;br /&gt;
    w ^= (w &amp;gt;&amp;gt; 19) ^ t ^ (t &amp;gt;&amp;gt; 8);&lt;br /&gt;
    return w;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Vergleich mit der &amp;lt;code&amp;gt;rand()&amp;lt;/code&amp;gt;-Funktion aus Libc ==&lt;br /&gt;
Die unter C (und C++) standardmäßig verfügbare Funktion rand() ist unter Linux ([[Glibc]]) und Windows als [[Linearer Kongruenzgenerator#Linearer Kongruenzgenerator|linearer Kongruenzgenerator]] implementiert und liefert eine Sequenz, die nicht einmal die einfachsten statistischen Tests besteht. Es ist somit von der Verwendung abzuraten.&lt;br /&gt;
&lt;br /&gt;
Ein Xorshift-RNG in der oben dargestellten Form ist mit lediglich fünf Variablen eine schnell implementierte Alternative, die jedoch auch einige statistische Tests nicht besteht.&lt;br /&gt;
&lt;br /&gt;
== Vergleich mit Mersenne-Twister ==&lt;br /&gt;
Der &amp;#039;&amp;#039;&amp;#039;Xorshift&amp;#039;&amp;#039;&amp;#039;-Generator ist dem [[Mersenne-Twister]] zumindest ebenbürtig, wenn nicht sogar überlegen:&lt;br /&gt;
&lt;br /&gt;
* Die generierten Bitsequenzen sind in beiden Fällen pseudozufällig und gleichverteilt, jedoch besteht der Mersenne-Twister nahezu alle stochastischen Tests.&lt;br /&gt;
* Der Speicherbedarf (für den Zustandsvektor) ist erheblich geringer (hier: 16&amp;amp;nbsp;Bytes, statt 2496&amp;amp;nbsp;Bytes).&lt;br /&gt;
* Auch ist der Xorshift-Generator knapp 60 % schneller.&lt;br /&gt;
* Bei schlechter Initialisierung (d.&amp;amp;nbsp;h. nur ein gesetztes Bit im Zustandsvektor) benötigt der Xorshift weniger als 10 Schritte, bis er wieder eine gleichverteilte Bit-Sequenz liefert. Der Mersenne-Twister benötigt hierzu fast 800.000 Schritte, was auch an dem größeren Zustandsvektor liegt.&amp;lt;ref name=&amp;quot;well_paper&amp;quot; /&amp;gt;&lt;br /&gt;
* Der Xorshift-RNG hat mit 2&amp;lt;sup&amp;gt;128&amp;lt;/sup&amp;gt;−1 eine kürzere Periodenlänge als der Mersenne-Twister mit 2&amp;lt;sup&amp;gt;19937&amp;lt;/sup&amp;gt;−1. Die nochmals deutlich größere Periodenlänge des Mersenne-Twisters liefert jedoch nicht wirklich eine Aussage über die Güte eines Zufallszahlengenerators: Eine längere Periode bedeutet nicht gleichzeitig eine höhere Güte oder im Ergebnis eine bessere Statistik. Darüber hinaus existieren andere moderne Generatoren mit noch längeren Perioden (bis zu 2&amp;lt;sup&amp;gt;131086&amp;lt;/sup&amp;gt; ≈ 10&amp;lt;sup&amp;gt;39461&amp;lt;/sup&amp;gt;) und teils überlegenen Eigenschaften (vgl. [[Multiply-with-carry#Complimentary Multiply-with-carry|CMWC]] und [[Well Equidistributed Long-period Linear|WELL]]).&lt;br /&gt;
&lt;br /&gt;
== Varianten ==&lt;br /&gt;
Xorshift versagt bei einigen Tests der BigCrush Test Suite ([[TestU01]]). Das gilt für alle Generatoren, die auf linearen Operationen basieren, wie auch [[Mersenne-Twister]] oder [[Well Equidistributed Long-period Linear|WELL]]. Es ist jedoch leicht, deren Ausgaben zu [[Verwürfelung|verwürfeln]], um ihre Qualität zu verbessern.&lt;br /&gt;
&lt;br /&gt;
=== Xorwow ===&lt;br /&gt;
Marsaglia schlug vor, die Periodenlänge zu vergrößern, indem Xorshift mit einem einfachen Zähler modulo 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt; kombiniert wird (was er als „Weyl-Sequenz“ bezeichnet; nach dem Gleichverteilungssatz von Weyl: die [[Folge (Mathematik)|Folge]] &amp;lt;math&amp;gt;(a \cdot i \bmod 1)_{i \in \N^+}&amp;lt;/math&amp;gt; mit [[Irrationale Zahl|irrationalem]] &amp;lt;math&amp;gt;a&amp;lt;/math&amp;gt; ist im Intervall &amp;lt;math&amp;gt;{[0,1[}&amp;lt;/math&amp;gt; gleichverteilt). Dieser Generator hat eine Periodenlänge von &amp;lt;math&amp;gt;(2^{128}-1) \cdot 2^{32}&amp;lt;/math&amp;gt;:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
/* die ersten vier Wörter von state[] dürfen nicht komplett mit 0 initialisiert werden */&lt;br /&gt;
uint32_t xorwow(uint32_t state[static 5])&lt;br /&gt;
{&lt;br /&gt;
	/* Algorithmus &amp;quot;xorwow&amp;quot; von S. 5 in Marsaglia, &amp;quot;Xorshift RNGs&amp;quot; */&lt;br /&gt;
	uint32_t s, t = state[3];&lt;br /&gt;
	t ^= t &amp;gt;&amp;gt; 2;&lt;br /&gt;
	t ^= t &amp;lt;&amp;lt; 1;&lt;br /&gt;
	state[3] = state[2]; state[2] = state[1]; state[1] = s = state[0];&lt;br /&gt;
	t ^= s;&lt;br /&gt;
	t ^= s &amp;lt;&amp;lt; 4;&lt;br /&gt;
	state[0] = t;&lt;br /&gt;
	return t + (state[4] += 362437);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Xorwow ist schnell, aber besteht einige Tests aus BigCrush nicht.&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |title=XORWOW L&amp;#039;ecuyer TestU01 Results&lt;br /&gt;
 |url=https://chasethedevil.github.io/post/xorwow-lecuyer-testu01-results/&lt;br /&gt;
 |date=2011-01-12&lt;br /&gt;
 |website=Chase The Devil (blog)&lt;br /&gt;
 |first=Fabien |last=Le Floc&amp;#039;h&lt;br /&gt;
 |accessdate=2017-11-02&lt;br /&gt;
}}&amp;lt;/ref&amp;gt; Er ist der Standardgenerator in Nvidias [[CUDA]].&amp;lt;ref&amp;gt;{{cite web&lt;br /&gt;
 |url=http://docs.nvidia.com/cuda/curand/testing.html&lt;br /&gt;
 |title=cuRAND Testing&lt;br /&gt;
 |publisher=[[Nvidia]]&lt;br /&gt;
 |accessdate=2017-11-02&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xorshift* ===&lt;br /&gt;
Xorshift* entsteht aus einem normalen Xorshift, indem man die Ausgabe mit einer Konstanten modulo &amp;lt;math&amp;gt;2^{32}&amp;lt;/math&amp;gt; bzw. &amp;lt;math&amp;gt;2^{64}&amp;lt;/math&amp;gt; multipliziert (von Marsaglia vorgeschlagen).&amp;lt;ref name=&amp;quot;xorshift_paper&amp;quot; /&amp;gt; Der folgende Generator mit 64 Zustandsbits hat die Periodenlänge &amp;lt;math&amp;gt;2^{64}-1&amp;lt;/math&amp;gt;&amp;lt;ref name=&amp;quot;vigna&amp;quot; /&amp;gt; und versagt nur beim MatrixRank-Test aus BigCrush:&lt;br /&gt;
&amp;lt;!--Specifically, this is A_1(12,25,27) with multiplier M_32 from line 3 of table 5--&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint64_t xorshift64star(uint64_t &amp;amp; x) &lt;br /&gt;
{&lt;br /&gt;
	x ^= x &amp;gt;&amp;gt; 12;       // a&lt;br /&gt;
	x ^= x &amp;lt;&amp;lt; 25;       // b&lt;br /&gt;
	x ^= x &amp;gt;&amp;gt; 27;       // c&lt;br /&gt;
	return x * 0x2545F4914F6CDD1D;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ein ähnlicher Generator wird in &amp;#039;&amp;#039;Numerical Recipes&amp;#039;&amp;#039; als &amp;#039;&amp;#039;RanQ1&amp;#039;&amp;#039; vorgeschlagen&amp;lt;ref name=&amp;quot;NR&amp;quot; /&amp;gt;; er versagt aber ebenfalls beim BirthdaySpacings-Test.&lt;br /&gt;
&lt;br /&gt;
Wenn man Xorshift* nur die 32 höchstwertigen Bits des Ergebnisses ausgeben lässt, 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.&amp;lt;ref name=&amp;quot;techreport&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Vigna&amp;lt;ref name=&amp;quot;vigna&amp;quot; /&amp;gt; schlägt folgenden Xorshift1024* vor, mit 1024 Zustandsbits und einer Periodenlänge von &amp;lt;math&amp;gt;2^{1024}-1&amp;lt;/math&amp;gt;, der BigCrush besteht:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
static uint64_t s[16]; // nicht komplett mit 0 initialisieren&lt;br /&gt;
static int p;&lt;br /&gt;
&lt;br /&gt;
uint64_t xorshift1024star(void) &lt;br /&gt;
{&lt;br /&gt;
	const uint64_t s0 = s[p];&lt;br /&gt;
    p = (p + 1) &amp;amp; 15;&lt;br /&gt;
	uint64_t s1 = s[p];&lt;br /&gt;
	s1 ^= s1 &amp;lt;&amp;lt; 31;        // a&lt;br /&gt;
	s1 ^= s1 &amp;gt;&amp;gt; 11;        // b&lt;br /&gt;
	s1 ^= s0 ^ (s0 &amp;gt;&amp;gt; 30); // c&lt;br /&gt;
	s[p] = s1;&lt;br /&gt;
	return s1 * (uint64_t)1181783497276652981;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xorshift+ ===&lt;br /&gt;
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.&amp;lt;ref name=&amp;quot;xsadd&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
XSadd hat Schwächen in den niederwertigen Ausgabebits und fällt bei einigen BigCrush-Tests durch, wenn man die Ausgabewörter invertiert, also die niederwertigsten Bits an die höchste Stelle setzt und umgekehrt. Als Abhilfe hat Vigna&amp;lt;ref name=&amp;quot;vigna2&amp;quot; /&amp;gt; die Xorshift+ Familie konstruiert, die mit 64-Bit-Wörtern arbeiten: nachfolgender Xorshift128+ nutzt 128 Zustandsbits und hat eine Periodenlänge von &amp;lt;math&amp;gt;2^{128}-1&amp;lt;/math&amp;gt;. Er besteht BigCrush, auch bei Invertierung.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
uint64_t s[2]; // nicht komplett mit 0 initialisieren&lt;br /&gt;
&lt;br /&gt;
uint64_t xorshift128plus(void) {&lt;br /&gt;
	uint64_t x = s[0];&lt;br /&gt;
	uint64_t const y = s[1];&lt;br /&gt;
	s[0] = y;&lt;br /&gt;
	x ^= x &amp;lt;&amp;lt; 23; // a&lt;br /&gt;
	s[1] = x ^ y ^ (x &amp;gt;&amp;gt; 17) ^ (y &amp;gt;&amp;gt; 26); // b, c&lt;br /&gt;
	return s[1] + y;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Es ist einer der schnellsten Generatoren, die BigCrush bestehen.&amp;lt;ref name=&amp;quot;shootout&amp;quot; /&amp;gt; Ein Nachteil der Addition von aufeinanderfolgenden Ausgabewörtern ist, dass der Generator so nur noch in einer Dimension gleichverteilt ist, obwohl dies für den zugrundeliegenden Xorshift in 2 Dimensionen gilt.&amp;lt;ref name=&amp;quot;vigna2&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Xoroshiro und Xoshiro ===&lt;br /&gt;
Diese von Sebastiano Vigna und David Blackman entwickelten Generatoren basieren auf der gleichen Theorie wie Xorshift.&amp;lt;ref name=&amp;quot;xoroshiro&amp;quot; /&amp;gt; Sie enthalten jedoch auch die [[Bitweiser Operator#Zyklische Verschiebung|Bitrotation]] als elementare Operation. Nachfolgende Versionen haben eine Periodenlänge von &amp;lt;math&amp;gt;2^{128}-1&amp;lt;/math&amp;gt;.&amp;lt;ref name=&amp;quot;xoroshiro-imp&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
inline uint64_t rotl (uint64_t a, int w) {&lt;br /&gt;
   return a &amp;lt;&amp;lt; w | a &amp;gt;&amp;gt; (64-w);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint64_t xoroshiro128plus(void) {&lt;br /&gt;
   static uint64_t s0 = 1451815097307991481;&lt;br /&gt;
   static uint64_t s1 = 5520930533486498032; // auch hier wieder nicht beide mit 0 initialisieren&lt;br /&gt;
&lt;br /&gt;
   const uint64_t result = s0 + s1;&lt;br /&gt;
&lt;br /&gt;
   s1 ^= s0;&lt;br /&gt;
   s0 = rotl(s0, 55) ^ s1 ^ (s1 &amp;lt;&amp;lt; 14);&lt;br /&gt;
   s1 = rotl(s1, 36);&lt;br /&gt;
&lt;br /&gt;
   return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint64_t xoroshiro128starstar(void) {&lt;br /&gt;
   static uint64_t s0 = 1321861022983091513;&lt;br /&gt;
   static uint64_t s1 = 3123198108391880477; // auch hier wieder nicht beide mit 0 initialisieren&lt;br /&gt;
&lt;br /&gt;
   const uint64_t result = rotl(s0 * 5, 7) * 9;&lt;br /&gt;
&lt;br /&gt;
   s1 ^= s0;&lt;br /&gt;
   s0 = rotl(s0, 24) ^ s1 ^ (s1 &amp;lt;&amp;lt; 16);&lt;br /&gt;
   s1 = rotl(s1, 37);&lt;br /&gt;
&lt;br /&gt;
   return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Xoshiro ist die weiterentwickelte Variante, die nochmals bessere Zufallszahlen erzeugt und eine Periodenlänge von &amp;lt;math&amp;gt;2^{256}-1&amp;lt;/math&amp;gt; aufweist.&amp;lt;ref name=&amp;quot;xoshiro&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
inline uint64_t rotl (uint64_t a, int w) {&lt;br /&gt;
   return a &amp;lt;&amp;lt; w | a &amp;gt;&amp;gt; (64-w);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
uint64_t xoshiro256(void) {&lt;br /&gt;
   static uint64_t s0 = 1321861022983091513;&lt;br /&gt;
   static uint64_t s1 = 3123198108391880477; // nicht alle vier mit 0 initialisieren&lt;br /&gt;
   static uint64_t s2 = 1451815097307991481;&lt;br /&gt;
   static uint64_t s3 = 5520930533486498032;&lt;br /&gt;
&lt;br /&gt;
   const uint64_t result = s0 + s3; // alternativ: result = rotl(s1 * 5, 7) * 9&lt;br /&gt;
&lt;br /&gt;
   const uint64_t t = s1 &amp;lt;&amp;lt; 17;&lt;br /&gt;
   s2 ^= s0;&lt;br /&gt;
   s3 ^= s1;&lt;br /&gt;
   s1 ^= s2;&lt;br /&gt;
   s0 ^= s3;&lt;br /&gt;
   s2 ^= t;&lt;br /&gt;
   s3 = rotl(s3, 45);&lt;br /&gt;
&lt;br /&gt;
   return result;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Liste von Zufallszahlengeneratoren]]&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* G. Marsaglia: [https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf &amp;#039;&amp;#039;Random number generators&amp;#039;&amp;#039;.] (PDF) In: &amp;#039;&amp;#039;Journal of Modern Applied Statistical Methods&amp;#039;&amp;#039;, Vol. 2, 2003, S.&amp;amp;nbsp;2–13.&lt;br /&gt;
* G. Marsaglia: {{Webarchiv|wayback=20110720154229|url=http://interstat.statjournals.net/YEAR/2005/articles/0510005.pdf|text=&amp;#039;&amp;#039;On the randomness of Pi and other decimal expansions&amp;#039;&amp;#039;}}. (PDF) Interstat, Oktober 2005, #5&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;xorshift_paper&amp;quot;&amp;gt;George Marsaglia: [http://www.jstatsoft.org/v08/i14/paper Xorshift RNGs]&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;testu01&amp;quot;&amp;gt;Bibliothek mit statistischen Tests: [https://simul.iro.umontreal.ca/testu01/tu01.html TestU01]&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;well_paper&amp;quot;&amp;gt;F. Panneton, P. L’Ecuyer: [http://www.iro.umontreal.ca/~lecuyer/myftp/papers/lfsr04.pdf &amp;#039;&amp;#039;Improved Long-Period Generators Base on Linear Recurrences Modulo&amp;amp;nbsp;2&amp;#039;&amp;#039;.] (PDF; 301&amp;amp;nbsp;kB)&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;xsadd&amp;quot;&amp;gt;[http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/XSADD/ XORSHIFT-ADD (XSadd): A variant of XORSHIFT]&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;vigna&amp;quot;&amp;gt;Xorshift*: [http://vigna.di.unimi.it/ftp/papers/xorshift.pdf An experimental exploration of Marsaglia&amp;#039;s xorshift generators, scrambled]&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;vigna2&amp;quot;&amp;gt;Xorshift+ Generatoren: [http://vigna.di.unimi.it/ftp/papers/xorshiftplus.pdf Further scramblings of Marsaglia&amp;#039;s xorshift generators]&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;shootout&amp;quot;&amp;gt;[http://prng.di.unimi.it/ xorshift*/xorshift+ generators and the PRNG shootout]&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;NR&amp;quot;&amp;gt;Buch „Numerical Recipes: The Art of Scientific Computing“, Press/Teukolsky/Vetterling/Flannery, 2007, Cambridge University Press. {{Webarchiv|url=http://apps.nrbook.com/empanel/index.html#pg=345 |wayback=20110811154417 |text=Kapitel: 7.1.2.A. 64-bit Xorshift Method |archiv-bot=2024-06-18 22:07:06 InternetArchiveBot }}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;techreport&amp;quot;&amp;gt;[http://www.pcg-random.org/pdf/hmc-cs-2014-0905.pdf#page=21 PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation]&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
{{cite techreport&lt;br /&gt;
 |title=PCG: A Family of Simple Fast Space-Efficient Statistically Good Algorithms for Random Number Generation&lt;br /&gt;
 |first=Melissa E. |last=O&amp;#039;Neill&lt;br /&gt;
 |publisher=[[Harvey Mudd College]]&lt;br /&gt;
 |id=HMC-CS-2014-0905&lt;br /&gt;
 |date=5 September 2014&lt;br /&gt;
 |pages=6–8,19&lt;br /&gt;
 --&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;xoroshiro&amp;quot;&amp;gt;{{Cite web|url=https://arxiv.org/abs/1805.01407|title=Scrambled Linear Pseudorandom Generators|last=Blackman |first=David|last2=Vigna |first2=Sebastiano|date=2018|accessdate=2018-04-14}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;xoroshiro-imp&amp;quot;&amp;gt;{{Cite web|url=http://vigna.di.unimi.it/xorshift/xoroshiro128plus.c|title=Original C source code implementation of Xoroshiro128+|last=Blackman |first=David|last2= Vigna |first2= Sebastiano|date=2016|accessdate=2017-07-21}}&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;xoshiro&amp;quot;&amp;gt;http://xoshiro.di.unimi.it&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Pseudozufallszahlengenerator]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Georg-Johann</name></author>
	</entry>
</feed>