AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

WELL 1024a Zufallszahlengenerator

Ein Thema von sx2008 · begonnen am 28. Mai 2013 · letzter Beitrag vom 29. Mai 2013
Antwort Antwort
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#1

WELL 1024a Zufallszahlengenerator

  Alt 28. Mai 2013, 15:10
Der WELL 1024a (Pseudo-)Zufallszahlengenerator hat eine Periodenlänge von fast 2^1024 (~ 10^308) und liefert ziemlich gleichverteilte Zufallszahlen.
Der Zufallszahlengenerator von Delphi hat dagegen nur eine Periodenlänge von 2^32.

Ich habe den Zufallsgenerator als Klasse implementiert, damit man mehrere Generatoren parallel betreiben kann.
Der Generator produziert entweder unsigned Integer (Cardinal) oder Fliesskommazahlen zwischen 0 und 1.
Angehängte Dateien
Dateityp: pas Well1024.pas (2,8 KB, 38x aufgerufen)
fork me on Github
  Mit Zitat antworten Zitat
Furtbichler
(Gast)

n/a Beiträge
 
#2

AW: WELL 1024a Zufallszahlengenerator

  Alt 28. Mai 2013, 19:05
Hier ein Mersenne-Twister mit einer Periodenlänge von 2^219937-1. Ich habe diesen Code auch nur von irgendwoher kopiert. Wie kommen die nur auf solche Periodenlängen? Wie sieht die Performance beider PRNG aus?
Angehängte Dateien
Dateityp: pas csMersenne.pas (3,2 KB, 34x aufgerufen)

Geändert von Furtbichler (28. Mai 2013 um 19:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#3

AW: WELL 1024a Zufallszahlengenerator

  Alt 29. Mai 2013, 14:07
Wie kommen die nur auf solche Periodenlängen?
Das hängt von der Grösse der inneren Zustands ab.
Bei Well1024a ist das STATE : array[0..32-1] of Cardinal ; 32 * sizeof(Cardinal) * 8 = 1024 Bit.
Allerdings werden nicht alle Zustände durchlaufen (insbesondere Zustand 0) daher kommt die -1.

Beim Mersenne-Twister sind es 624 * sizeof(Integer) * 8 = 19968 Bit wobei wohl ein Bit nicht genutzt werden kann und dann halt "nur" 2^219937-1 Zustände bleiben.

Der Vorteil des Well gegenüber Mersenne-Twister ist, das der Well-Generator schon nach ~ 100 Schritten "eingelaufen" ist, während Mersenne-Twister dazu ~ 70000 Schritte braucht.

"Einlaufen" heisst, man muss entsprechend viele Zufallszahlen abrufen und wegwerfen, bevor man mit guten gleichverteilten Zahlen rechnen kann.

Wie sieht die Performance beider PRNG aus?
Hab's nicht gemessen, aber der Well1024 dürfte etwas schneller sein weil er keine for-Schleifen enthält.
fork me on Github
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz