Delphi-Code at gokiburi.de

Mersenne Twister


Inhalt: Der PC kann keine Zufallszahlen erzeugen, sondern nur pseudozufällige Zahlen. Eine Pseudozufallszahl erscheint zufällig, ist in Wirklichkeit jedoch berechenbar. Programme wie Excel oder die C-Standardbibliothek verfügen daher nur über Pseudozufallszahlengeneratoren. Sie erzeugen Zahlenfolgen, die zwar zufällig aussehen, es aber nicht sind, da sie durch einen deterministischen Algorithmus berechnet werden. Bei jeder Berechnung mit gleichem Startwert wird die gleiche pseudozufällige Zahlenfolge erzeugt.
Im Gegensatz zu echten Zufallszahlen wiederholen sich die Zahlenfolgen bei Pseudozufallszahlen nach einer gewissen Anzahl von erzeugten Zufallszahlen. Diese Anzahl von Werten, die erzeugt werden können, bis es zu einer Wiederholung kommt, nennt man Periodenlänge. Der Mersenne Twister erzeugt zwar ebenfalls Pseudozufallszahlen, diese sind allerdings sehr hochwertig. Er hat die extrem lange Periode von 2^19937-1. Er liefert hochgradig gleichverteilte Sequenzen. Er ist sehr schnell. Das vorliegende Delphi-Programm erzeugt solche Mersenne-Zufallszahlen in frei wählbaren Grenzen. Es benutzt den Algorithmus von Makoto Matsumoto und Takuji Nishimura (http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html).

Nutzung: Geben Sie in die beiden Felder die Grenzen ein, in denen die Zufallszahlen liegen sollen.
Anschließend klicken Sie auf den Button "Zufallszahl".

Version: 1.0.8.10

Größe: 904 KByte

Letzte Änderung: 8. September 2010

Download: MersenneTwister.exe  Unit: MT19937.pas

92 Mal heruntergeladen                              117 Mal heruntergeladen




Funktion: Das Programm verwendet die Unit MT19937 von Makoto Matsumoto und Takuji Nishimura.
Die Zufallszahlen werden dann folgendermaßen erzeugt:
procedure TForm1.Button1Click(Sender: TObject);
var i, range : longint;
begin
  Randomize_MT19937;
  range := StrToInt64(Edit1.Text);
  i := RandInt_MT19937(range) + 1;
  Memo1.Text := Memo1.Text + IntToStr(i) + #13#10;
  if Memo1.Height <= (Memo1.Lines.Count+2) * abs(Memo1.Font.Height) then
    Memo1.ScrollBars := ssVertical else
    Memo1.ScrollBars := ssNone;
end;