Zitat:
und wenn ich das richtig verstanden habe brauche ich NRnd kein TRandom übergeben weil er dann automatisch das TRandom aus der RNG.Pas benutzt und das reicht für gute zufallszahlen?
Ja selbstverständlich
Per Default ist RND vom Klassentyp TRandom_LFSR mit 2^128-1 Bits Periode. Delphis Random() ist dagegen nur ein LCG = Linear Congruental Generator mit maximal 2^32-1 Bits Periode.
Die statistischen Eigenschaften der LFSR's = Linear Feadback Shift Register sind bei weitem besser als die der LCG's. Wenn man Zb. eine Monochrome Bitmap per Random() Pixelweise füllt so kann man je nach Seed und Bitmap Dimension eindeutig grafische Muster erkennen, sprich Wiederholungen. Nimmt man dagegen einen LFSR so sieht man immer ein Bild das Weises Rauschen darstellt, also keine Wiederholungen.
Es macht ja keinen Sinn eigene TRandom_XXX Klassen im
DEC zu integrieren wenn diese nicht wesentlich besser sind als Delphis Random() Funktion. Zudem ist der 128 Bit LFSR ziemlich schnell,auf einem alten PII 266MHz Rechner erzeugt dieser LFSR Zufall mit 40Mb/sec.
Ich habe dir aber mal meine alten zusätzlichen TRandom_XXX Klassen rangehangen. Diese basieren NICHT auf IInteger sondern auf TBigNum, meiner vorherigen Klassenbasierten Large Integers.
Enthalten sind ein LCG = TRandom_LCG = Linear Congruential Generator der aber im Gegensatz zum Delphi Random() LCG mit viel viel größeren Perioden arbeiten kann. Statt also nur 2^32-1 Bit Periode kannste den mit 2^2048 oder viel viel größerer Periode laufen lassen.
Dann der TRandom_MSG = "Micali Schnorr" Generator, dieser basiert auf dem RSA Verfahren und ist ein kryptographisch sicherer RNG wenn man die beiden Primzahlen >= 512 Bit wählt. Bei Primzhalne mit 512 Bit wäre demnach die Periode 2^1024 -1 Bits, und falls man die benutzten Primzahlen und Seeds nicht kennt ist er nicht knackbar -> sprich vorhersehbar.
Dann der TRandom_BBS = "Blum Blum Shub" Generator. Das ist der Quadratische Restegenerator und der zur Zeit mathematisch beweiseneermaßen einzigst sichere Zufallsgenerator.
Dann der TRandom_ISAAC = der nach dem ISAAC Verfahren arbeitet. So ganz traue ich diesem nicht, allerdings gibt es viele vergleichbare Impelementierungenin anderen Programmiersprachen, und er wird sehr oft verwendet. Um also zu diesen anderen Libraries kompatibel zu sein.
Natürlich müsstest du die TBigNums durch IInteger ersetzen, das habe ich bisher nicht gemacht.
Gruß Hagen
PS: und danke für's Kompliment