Entwickler-Ecke
Algorithmen, Optimierung und Assembler - random nicht zufällig, wiederholung nach high(dword)
uall@ogc - Fr 13.05.05 15:28
Titel: random nicht zufällig, wiederholung nach high(dword)
[meta]zufall random wiederholen wiederholt[/meta]
ich habe das thema nur erstellt falls es leute gibt die nach zufall suchen hier drauf stoßen
die delphi random funktion wiederholt sich nach einem durchlauf von 0 bis high(dword)
beweis:
http://www.uall.info/files/randomtest.zip
(das soll hier jetzt keine neue diskussion werden)
Moderiert von
raziel: Meta-Tags hinzugefügt.
delfiphan - Fr 13.05.05 17:08
Auch nur eine Zusatzbemerkung:
Delphi benützt einen Linear Congruential Generator; der wohl simpleste (aber auch schlechteste) Randomgenerator, den es überhaupt gibt.
Wie
uall@ogc schon gesagt hat, ist die Periodenlänge genau 2^32 (für jeden Seed). Und es wird während einer Periode niemals eine Zahl doppelt gezogen. Dies gilt für "
random()" (welche eine Gleitkommazahl zwischen 0 und 1 zurückgibt).
Das
random(MaxRand) ist meines Wissens äquivalent zu
Trunc(random*MaxRand). Daraus folgt, dass die Periodenlänge dort ebenfalls 2^32 ist; aber es können für MaxRand<2^32 natürlich Zahlen mehrfach gezogen werden.
Delphi-Random-Generator veranschaulicht:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| var I: DWord; MyRand: DWord; begin randseed := 0; for I := 1 to 10 do Memo1.Lines.Add(FloatToStr(random)); MyRand := 0; for I := 1 to 10 do begin MyRand := MyRand*134775813+1; Memo1.Lines.Add(FloatToStr(MyRand/4294967296.0)); end; end; |
Tobias1 - Fr 13.05.05 17:34
Gibts da von Delphi auch noch ein anderer Generator der besser ist?
BenBE - Fr 13.05.05 21:20
Nein, von Delphi selber nicht, aber das DEC Part I von Hagen Reddmann (User negaH in der DP) bietet einen PRNG mit einer Periode von 2^4096-1 IIRC.
delfiphan - Fr 13.05.05 21:25
Lagged Fibonacci Generatoren haben eine viel, viel längere Periode (als der Delphi Random Generator). Kann man im Prinzip selbst programmieren (meines Wissens nicht mehr als 10 Zeilen nötig). Oder im Google suchen.
Fabian W. - Sa 14.05.05 07:52
Genau das wollte ich fragen. Hats sich schonmal jemand einen Generator programmiert? Ich bin mit random nicht zu frieden, da bei mir auf ca 100 random durchgänge (von 0 bis 20) mind 25x die gleiche Zahl kommt.
delfiphan - Sa 14.05.05 14:43
Fabian W. hat folgendes geschrieben: |
Genau das wollte ich fragen. Hats sich schonmal jemand einen Generator programmiert? Ich bin mit random nicht zu frieden, da bei mir auf ca 100 random durchgänge (von 0 bis 20) mind 25x die gleiche Zahl kommt. |
Ich weiss, du wurdest schon öfters kritisiert wegen solchen Posts. Ich tue es jetzt auch: Wenn du überhaupt mal nach einem anderen Generator gesucht hättest, wärst du schon lange fündig geworden (Google). Ausserdem hat BenBE einen konkreten Generator vorgeschlagen.
Übrigens: Die Wahrscheinlichkeit, dass deine Aussage wahr ist, ist verschwindend gering (1:70 Mia). Ich muss den Random-Generator von Delphi auch etwas verteidigen: Für alltägliche Zwecke sollte der Random-Generator von Delphi völlig ausreichen. Erst wenn man Monte-Carlo Sampling (o.ä.) in höheren Dimensionen macht, oder sehr, sehr viele Random-Zahlen benötigt, dann stösst man mit dem Random-Generator von Delphi an die Grenzen.
Ich entschuldige mich, wenn ich falsch liege. Und: Ein persönlicher Angriff ist's übrigens nicht (damit jetzt kein Streit ausbricht).
PS: :arrow: Informationen über
Lagged Fibonacci Generatoren [
http://en.wikipedia.org/wiki/Lagged_Fibonacci_generator].
zemy - Sa 14.05.05 16:46
Habe einen anderen schönen Generator gefunden. Scnell, lange Periode (2^19937-1), übersetzt in andere Priogrammiersprachen, u.a. Delphi. Werde mr den Code mal zu gemüte führen...
der Link:
http://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/emt.html
Zitat: |
Genau das wollte ich fragen. Hats sich schonmal jemand einen Generator programmiert? Ich bin mit random nicht zu frieden, da bei mir auf ca 100 random durchgänge (von 0 bis 20) mind 25x die gleiche Zahl kommt. |
Komme auf ne Wahrscheinlichkeit von ca. 1,2%... Unwahrscheinlich (seeeeehhhr unwahrscheinlich) aber möglich..
hallo - Mi 08.06.05 17:33
Das Delphirandom hängt von der Uhrzeit ab!
D.h.: Wenn ich in einer ms 10 mal random(x) ausführe, bekomm ich immer den gleichen Wert zurück!!!
delfiphan - Mi 08.06.05 22:42
hallo: Die Funktion
Randomize dient dazu, den Random-Generator zu initialisieren. Die Funktion solltest du nur einmal pro Programmstart ausführen; nicht vor jedem Aufruf von
random.
Dein Problem kannst du also beheben, in dem du
Randomize nur noch einmal, d.h. beim Programmstart ausführst.
hallo - Do 09.06.05 16:30
Achsooo! Ok, ich werds nicht mehr vergessen!!! :oops:
Delete - Do 09.06.05 16:46
Steht aber auch in der Hilfe. Musst du dir also nicht unbedingt merken. ;)
F34r0fTh3D4rk - Do 09.06.05 17:03
aber kann man nicht sowas machen, wenn zb ziffern generiert werden sollen kann man doch
2 zufallszahlen generieren lassen, und diese multiplizieren, diese zahl wandelt man in einen string um und wählt draus eine zufallsziffer, wäre das besser oder ist das irrsinn ?
hallo - Do 09.06.05 17:35
Wenn man übrigens aus einer Zahl eine Zufallszahl BERECHNEN will, dann macht man einfach
So wird aus zahl ein Wert generiert. Wenn man 3 als Maximalwert angibt, dann kann 0,1,2 rauskommen.
Falls als Maximalwert 0 eingegeben wird, schlägt es aber mit einer Division by zero fehl!!!!
Wollt ich hier nur mal erwähnen!
F34r0fTh3D4rk - Do 09.06.05 18:43
wieso des ? und was ist zahl ?
delfiphan - Do 09.06.05 20:36
hallo hat folgendes geschrieben: |
Wenn man übrigens aus einer Zahl eine Zufallszahl BERECHNEN will, dann macht man einfach [mod]. |
Mod hat nicht viel mit Zufall zu tun. Es gibt dir einfach der Rest der Division zurück.
a mod b ist equivalent zu
a-(a div b)*b bzw.
a and (b-1), falls
b eine Zweierpotenz ist (
b>0).
mimi - So 12.06.05 13:10
@hallo:aber dann sollte sich doch zahl verhändern oder nicht ?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!