Auflösung des Zufallsgenerators

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Auflösung des Zufallsgenerators

Beitrag von RSE »

Also wenn ich http://de.wikipedia.org/wiki/Pseudozufallszahl im Zusammenhang mit den bisherigen Aussagen richtig interpretiere, dann generiert FPC bei gleichen Startwert (Seed) immer die gleichen Zufallszahlen. Diese Funktion ist, basierend auf dem Startwert, effizient berechenbar, ohne diesen aber nicht. Effizient berechenbar heißt hierbei, dass es einen Algorithmus gibt, der die Funktion in einer Zeit t hoch c berechnen kann, wobei c konstant ist. Nicht effizient hieße t steht im Exponenten. Bei einem weiteren Besuch auf http://en.wikipedia.org/wiki/Mersenne_twister bzw. der deutschen Version dieser Seite, habe ich dann auch gefunden, dass der Algorithmus eine sehr gute Gleichverteilung liefert (das englische k-distribution hat mir nichts gesagt).

Ergo:
  • Wer einfach eine ohne den Startwert unvorhersagbare und über etwa 6000 Dezimalstellen gleichverteilte Zahlenfolge braucht, für den liefert 1x randomize + beliebig oft (auch in einer Schleife direkt hintereinander) angewandtes random das gewünschte Ergebnis.
  • Wer unbedingt echte Zufallszahlen braucht (z.B. für die Vergabe von Banking-PINs oder sowas), sollte vor jedem random eine Zeit abwarten, dessen Länge durch eine Benutzerinteraktion oder etwas ähnlich zeitlich unvorhersehbares (nicht random!) bestimmt wird und 1x randomize aufrufen (oder kann man die seed auch anders als über die Zeit setzen?).

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Auflösung des Zufallsgenerators

Beitrag von lrlr »

ja, indem du mit strg auf Randomize clickst ;-)

dort wirst du feststellen dass dort (nur)

begin
randseed:=GetTickCount;
end;

steht

randseed steht im INTERFACE teil der system unit

kann also auch von extern beliebig (z.b. mausgewegung) gesetzt werden..

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Auflösung des Zufallsgenerators

Beitrag von lrlr »

und ist damit NICHT threadsafe..

wer (bei borland) hat denn DAS verbrochen ?????

Scotty
Beiträge: 768
Registriert: Mo 4. Mai 2009, 13:24
OS, Lazarus, FPC: Arch Linux, Lazarus 1.3 r44426M FPC 2.6.4
CPU-Target: x86_64-linux-qt/gtk2
Kontaktdaten:

Re: Auflösung des Zufallsgenerators

Beitrag von Scotty »

Bei mir steht unter Randomize() "randseed:=longint(Fptime(nil));", was auf syscall_nr_gettimeofday() verweist.
Um auch mein Halbwissen in diese Diskussion einzubringen: AFAIK waren es 2^15 verschiedene Werte unter TP gewesen. Die Begrenzung entsteht IMHO aus einer Modulo-Verrechnung. Vom Prinzip her: random:=random * x mod y. Allerdings gibt es beim Mersenne-Twister (genrand_MT19937) nur ein wildes xor, and, shift Verschieben, das auf einen Blick zu verstehen, einen höheren IQ als meinen bedarf. Dafür steht folgendes im Quellcode:

Code: Alles auswählen

What is Mersenne Twister?
   Mersenne Twister(MT) is a pseudorandom number generator developped by
   Makoto Matsumoto and Takuji Nishimura (alphabetical order) during
   1996-1997. MT has the following merits:
   It is designed with consideration on the flaws of various existing
   generators.
   Far longer period and far higher order of equidistribution than any
   other implemented generators. (It is proved that the period is 2^19937-1,
   and 623-dimensional equidistribution property is assured.)
   Fast generation. (Although it depends on the system, it is reported that
   MT is sometimes faster than the standard ANSI-C library in a system
   with pipeline and cache memory.)
   Efficient use of the memory. (The implemented C-code mt19937.c
   consumes only 624 words of working area.)

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Auflösung des Zufallsgenerators

Beitrag von RSE »

lrlr hat geschrieben:und ist damit NICHT threadsafe..

wer (bei borland) hat denn DAS verbrochen ?????
Die ganze Borland VCL ist AFAIK nicht threadsafe ausgelegt.

@Scotty: GetTickCount ist ein WinAPI-Aufruf, der die Zeit seit Systemstart in ms zurückgibt. Nach 49,7 Tagen läuft der über (in der 32bit Version der Funktion). Folglich musst du in deinem nicht-Win-Betriebssystem eine andere Implementierung haben.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: Auflösung des Zufallsgenerators

Beitrag von lrlr »

>Die ganze Borland VCL ist AFAIK nicht threadsafe ausgelegt.

"natürlich" nicht,
heißt ja auch Visual Component Library

die GUI selber kann ja nur im main-thread "laufen"

die system unit zähle ICH nicht zur VCL /LCL/JCL/CLX wasauchimmer...

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Auflösung des Zufallsgenerators

Beitrag von RSE »

ups, sorry, da hast du nun auch wieder recht...
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

indianer-frank
Beiträge: 134
Registriert: So 30. Nov 2008, 21:53

Re: Auflösung des Zufallsgenerators

Beitrag von indianer-frank »

Wenn Borland (oder wie sie jetzt auch heißen mögen) das "verbricht", ist das eine Sache, warum FPC es nicht besser macht, wenn schon ein inkompatibles random/randseed implementiert wird, ist schon weniger amüsant.

Noch schlimmer ist jedoch, daß sie nicht nur randseed nicht threadsafe machen bzw. mehrfach/gleichzeitig benutzbar (das könnte man halbwegs hinbiegen, wenn man den alten Wert rettet und wieder herstellt), aber beim MT besteht der Kontext aus 624 longints + Indix. Außerdem ist das Umsetzen von randseed durch einen "Hack" (siehe genrand_MT19937 in system.inc) quasi ausgehebelt.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Auflösung des Zufallsgenerators

Beitrag von pluto »

Wir könnten ja einen besseren Random erstellen. Im Übringen ist die LCL auch nicht Thread sicher. Was auch durchaus einen Sinn ergibt.
Die Frage währe: Könnte man eine Funktion schreiben, die echte Randomzahlen ausgibt ? In Linux gibt es eine Datei die mit "Zufällige" zahlen gefüllt wurden sind, aber ob das was nützt ?
MFG
Michael Springwald

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Auflösung des Zufallsgenerators

Beitrag von RSE »

pluto hat geschrieben:Die Frage währe: Könnte man eine Funktion schreiben, die echte Randomzahlen ausgibt ?
Die Antwort: nein. Alles, was Rechner berechnen können ist ja berechenbar und somit nicht echt zufällig. Die Zahlen in der Datei sind durch ihre Speicherung nun auch bekannt und nicht mehr zufällig. Der Zufallszahlenalgorithmus ist schon okay so, wie er ist. Bestenfalls die Threadsicherheit könnte man offenbar verbessern.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: Auflösung des Zufallsgenerators

Beitrag von pluto »

Dann müsst er so aufgebaut sein das er sie nicht Berechnet sondern Ermittelt. Die frage währe halt nur wie. Somit gibt es keinen Echten Zufalls zahlen. Eigentlich schade. Mir reicht jedoch der Standard Random voll und ganz.
MFG
Michael Springwald

RSE
Beiträge: 462
Registriert: Mi 30. Jul 2008, 13:11
OS, Lazarus, FPC: WinXP SP3 (L 0.9.28.2 FPC 2.2.4)
CPU-Target: 32Bit
Kontaktdaten:

Re: Auflösung des Zufallsgenerators

Beitrag von RSE »

Hab ich oben schon geschrieben: In Abhängigkeit von irgendwelchen Benutzereingaben (Mausposition oder irgendwelche hochaufgelöste Reaktionszeiten des Benutzers als Seed). Aber das kannst du nur in Ausnahmefällen realisieren. Im Normalfall ist es auch einfach nicht nötig.
Seit er seinen neuen Computer hat, löst er alle Probleme, die er vorher nicht hatte!

Socke
Lazarusforum e. V.
Beiträge: 3178
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Auflösung des Zufallsgenerators

Beitrag von Socke »

RSE hat geschrieben:Hab ich oben schon geschrieben: In Abhängigkeit von irgendwelchen Benutzereingaben (Mausposition oder irgendwelche hochaufgelöste Reaktionszeiten des Benutzers als Seed). Aber das kannst du nur in Ausnahmefällen realisieren. Im Normalfall ist es auch einfach nicht nötig.
m Normalfall reichen ja auch Pseudozufallszahlen aus. In der Regel reichen auch Pseudezufallszahlen mit einem echt zufälligen Startwert aus. Das heißt weiter Random() benutzen und vorher einen Wert für randseed aus /dev/random lesen. Für Linux sind die Zahlen auch über einen Reboot sicher (der Inhalt wird gespeichert), solange der Angreifer keinen Root-Zugriff auf die Datei hat (sollte auf einem System, das unbedingt diese Sicherheit bei den Zufallszahlen bieten muss, selbstverständlich sein).
Unter Windows weiß ich leider nicht, wie man entsprechende echte Zufallszahlen beziehen kann; die eigenständige Generation über Maus-/Tastatureingabe ist aber sicherlich möglich (auch wenn ich nicht weiß, inwiefern das innerhalb der RTL gelöst werden könnte).
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten