<?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=Well_Equidistributed_Long-period_Linear</id>
	<title>Well Equidistributed Long-period Linear - 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=Well_Equidistributed_Long-period_Linear"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Well_Equidistributed_Long-period_Linear&amp;action=history"/>
	<updated>2026-06-02T23:42:36Z</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=Well_Equidistributed_Long-period_Linear&amp;diff=2094919&amp;oldid=prev</id>
		<title>imported&gt;Caustic: /* Weblinks */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Well_Equidistributed_Long-period_Linear&amp;diff=2094919&amp;oldid=prev"/>
		<updated>2023-11-11T18:18:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Weblinks&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Der &amp;#039;&amp;#039;&amp;#039;Well Equidistributed Long-period Linear&amp;#039;&amp;#039;&amp;#039; (kurz: &amp;#039;&amp;#039;&amp;#039;WELL&amp;#039;&amp;#039;&amp;#039;) ist ein [[Pseudozufallszahlengenerator]], der 2006 von François Panneton und Pierre L’Ecuyer entwickelt wurde. Er wurde konzipiert, um schnell [[Gleichverteilung|gleichverteilte]] Pseudozufallszahlen mit extrem langer Periode zu generieren und basiert auf [[Lineare Differenzengleichung|linearen Rekursionsgleichungen]].&amp;lt;ref name=&amp;quot;well_paper&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Eigenschaften ==&lt;br /&gt;
&lt;br /&gt;
WELL-Zufallszahlengeneratoren haben mit Periodenlängen von &amp;lt;math&amp;gt;2^k - 1&amp;lt;/math&amp;gt; (mit &amp;#039;&amp;#039;k&amp;#039;&amp;#039; ∈ {512, 607, 800, 1024, 19937, 21701, 23209, 44497})&lt;br /&gt;
bei geringem Aufwand sehr lange Periodenlängen (in Potenzschreibweise zwischen etwa 10&amp;lt;sup&amp;gt;154&amp;lt;/sup&amp;gt; und etwa 10&amp;lt;sup&amp;gt;13395&amp;lt;/sup&amp;gt;).&lt;br /&gt;
Sie generieren hochgradig gleichverteilte Sequenzen. Diesbezüglich haben die erzeugten Zufallszahlen sogar eine höhere Qualität als die des [[Mersenne-Twister]]s,&amp;lt;ref name=&amp;quot;mt_homepage&amp;quot; /&amp;gt;&amp;lt;ref name=&amp;quot;well_paper&amp;quot; /&amp;gt; wobei auch WELL ähnlich schnell wie der Mersenne-Twister Zufallszahlen liefert.&lt;br /&gt;
&lt;br /&gt;
Seine Eigenschaften prädestinieren WELL insbesondere zur Verwendung in statistischen Simulationen (z. B. [[Monte-Carlo-Simulation]]). Hingegen ist der WELL genauso wie der Mersenne-Twister (und &amp;#039;&amp;#039;alle&amp;#039;&amp;#039; anderen LRGs) für kryptographische Anwendungen nicht direkt geeignet. Bei vergleichsweise kurzer Beobachtung seiner Ausgaben kann sein interner Zustand ermittelt werden und so alle zukünftigen Zahlen vorhergesagt werden. Dieses Problem kann umgangen werden, indem man mehrere Ausgabeworte in einem Block sammelt und auf diesen dann eine [[Kryptologische Hashfunktion|sichere Hashfunktion]] anwendet (z. B. [[Secure Hash Algorithm|SHA-256]]).&amp;lt;ref name=&amp;quot;mt_faq&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Algorithmus ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z_0 \leftarrow rot_p ( v^T_{i,r-2}, v^T_{i,r-1} )^T;&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z_1 \leftarrow T_0 v_{i,0} \oplus T_1 v_{i,m_1};&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z_2 \leftarrow T_2 v_{i,m_2} \oplus T_3 v_{i,m_3}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;z_3 \leftarrow z_1 \oplus z_2&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v_{i+1,r-1} \leftarrow v_{i,r-2} \wedge m_p&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;\begin{align}&lt;br /&gt;
\text {for}~ &amp;amp;j := r-2, \dots, 2 \quad \text {do} \\&lt;br /&gt;
\quad &amp;amp; v_{i+1,j} \leftarrow v_{i,j-1}&lt;br /&gt;
\end{align}&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v_{i+1,1} \leftarrow z_3&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;math&amp;gt;v_{i+1,0} \leftarrow z_4&amp;lt;/math&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ausgabe: &amp;lt;math&amp;gt;y_i = v_{i,1}&amp;lt;/math&amp;gt; oder &amp;lt;math&amp;gt;y_i = v_{i,0}&amp;lt;/math&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Initialisierung ==&lt;br /&gt;
&lt;br /&gt;
Zur Initialisierung wird das Zustandsarray auf beliebige (zufällige) Werte gesetzt. Diese initialen Werte stellen in erster Linie nur eine Position in der &amp;lt;math&amp;gt;2^k-1&amp;lt;/math&amp;gt; langen Bit-Sequenz dar, bei der der Generator startet.&lt;br /&gt;
&lt;br /&gt;
Das Initialisieren mit nur Nullen führt zur konstanten Ausgabe des Wertes 0 (das ist der zweite mögliche Zyklus des Zufallszahlengenerators mit der Periodenlänge 1). Sind dagegen nur viele (aber nicht alle) Bits des Zustandswortes „0“, liefert der WELL wie auch der Mersenne-Twister (und alle(!) anderen LRGs) anfänglich keine gleichverteilten Zufallszahlen mehr. Dieser Fall kann auftreten, wenn schlecht initialisiert wurde.&lt;br /&gt;
&lt;br /&gt;
Gerade hier erweisen sich die WELL-Generatoren gegenüber dem [[Mersenne-Twister]] und dessen kleinem Bruder, dem [[Mersenne-Twister#TT800|TT800]], als überlegen: Sie liefern bereits nach einigen hundert Schritten (z. B. 700 für den WELL-19937) wieder eine gleichverteilte Bit-Sequenz. Der Mersenne-Twister benötigt hier bis zu 700.000 Schritte und der TT800 immer noch mehr als 60.000.&amp;lt;ref name=&amp;quot;well_paper&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Periodenlänge ==&lt;br /&gt;
&lt;br /&gt;
Die WELL-Generatoren sind so entworfen, dass sie eine für linear rückgekoppelte Generatoren maximale Periodenlänge besitzen, d. h. den gesamten Zustandsraum (außer der 0) durchlaufen. Die Periodendauer beträgt 2&amp;lt;sup&amp;gt;k&amp;lt;/sup&amp;gt;-1, in Potenzschreibweise etwa 10&amp;lt;sup&amp;gt;0,3·k&amp;lt;/sup&amp;gt;.&lt;br /&gt;
&amp;#039;&amp;#039;k&amp;#039;&amp;#039; ist hierbei die Ordnung des charakteristischen Polynoms &amp;#039;&amp;#039;P(z)&amp;#039;&amp;#039; der Transitionsmatrix &amp;#039;&amp;#039;A&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
== Implementierung in C ==&lt;br /&gt;
&lt;br /&gt;
Hier ist beispielhaft die Implementierung in C für den WELL1024a dargestellt.&amp;lt;ref name=&amp;quot;well_homepage&amp;quot; /&amp;gt; Der Generator liefert gleichverteilte Zufallszahlen auf dem Intervall [0, 2&amp;lt;sup&amp;gt;32&amp;lt;/sup&amp;gt;-1].&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;
#define R   32      /* Anzahl der Worte im Zustandsregister */&lt;br /&gt;
&lt;br /&gt;
#define M1   3&lt;br /&gt;
#define M2  24&lt;br /&gt;
#define M3  10&lt;br /&gt;
&lt;br /&gt;
#define MAT0POS(t,v)  (v ^ (v &amp;gt;&amp;gt;  (t)))&lt;br /&gt;
#define MAT0NEG(t,v)  (v ^ (v &amp;lt;&amp;lt; -(t)))&lt;br /&gt;
#define Identity(v)   (v)&lt;br /&gt;
&lt;br /&gt;
#define V0            State[ i         ]&lt;br /&gt;
#define VM1           State[(i+M1)  % R]&lt;br /&gt;
#define VM2           State[(i+M2)  % R]&lt;br /&gt;
#define VM3           State[(i+M3)  % R]&lt;br /&gt;
#define VRm1          State[(i+R-1) % R]&lt;br /&gt;
&lt;br /&gt;
#define newV0         State[(i+R-1) % R]&lt;br /&gt;
#define newV1         State[ i         ]&lt;br /&gt;
&lt;br /&gt;
/* Der Zustandsvektor muss mit (pseudo-)zufälligen Werten initialisiert werden. */&lt;br /&gt;
static uint32_t State[R];&lt;br /&gt;
&lt;br /&gt;
uint32_t WELL1024()&lt;br /&gt;
{&lt;br /&gt;
  static uint32_t i = 0;&lt;br /&gt;
  uint32_t        z0;&lt;br /&gt;
  uint32_t        z1;&lt;br /&gt;
  uint32_t        z2;&lt;br /&gt;
&lt;br /&gt;
  z0    = VRm1;&lt;br /&gt;
  z1    = Identity( V0)      ^ MAT0POS ( +8, VM1);&lt;br /&gt;
  z2    = MAT0NEG (-19, VM2) ^ MAT0NEG (-14, VM3);&lt;br /&gt;
  newV1 = z1                 ^ z2;&lt;br /&gt;
  newV0 = MAT0NEG (-11,  z0) ^ MAT0NEG ( -7,  z1) ^ MAT0NEG (-13,  z2);&lt;br /&gt;
  i     = (i + R - 1) % R;&lt;br /&gt;
&lt;br /&gt;
  return State[i];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
&lt;br /&gt;
* [[Liste von Zufallszahlengeneratoren]]&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.iro.umontreal.ca/~panneton/WELLRNG.html Implementierung der Autoren &amp;#039;&amp;#039;(k=512, 1024, 19937, 44497)&amp;#039;&amp;#039;]&lt;br /&gt;
* [https://github.com/sergiud/random/blob/master/well.hpp Implementierungen anderer WELL]&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;well_paper&amp;quot;&amp;gt;F. Panneton, P. L&amp;#039;Ecuyer: &amp;#039;&amp;#039;[http://www.iro.umontreal.ca/~lecuyer/myftp/papers/lfsr04.pdf Improved Long-Period Generators Base on Linear Recurrences Modulo 2] (PDF; 301&amp;amp;nbsp;kB)&amp;#039;&amp;#039;.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;well_homepage&amp;quot;&amp;gt;F. Panneton, P. L&amp;#039;Ecuyer: &amp;#039;&amp;#039;[http://www.iro.umontreal.ca/~panneton/WELLRNG.html Homepage des WELL RNG]&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mt_homepage&amp;quot;&amp;gt;M. Matsumoto: &amp;#039;&amp;#039;[http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html Mersenne-Twister Homepage]&amp;#039;&amp;#039;&amp;lt;/ref&amp;gt;&lt;br /&gt;
&amp;lt;ref name=&amp;quot;mt_faq&amp;quot;&amp;gt;M. Matsumoto: &amp;#039;&amp;#039;[http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/efaq.html Mersenne-Twister-FAQ]&amp;#039;&amp;#039;&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;Caustic</name></author>
	</entry>
</feed>