Autor |
Beitrag |
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Fr 13.05.05 15:28
[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:
www.uall.info/files/randomtest.zip
(das soll hier jetzt keine neue diskussion werden)
Moderiert von raziel: Meta-Tags hinzugefügt.
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 454
Win 98, XP Prof
D3 Prof, D2005 Prof
|
Verfasst: Fr 13.05.05 17:34
Gibts da von Delphi auch noch ein anderer Generator der besser ist?
_________________ Auch das schlechteste Buch hat seine gute Seite: die letzte. (John Osborne)
|
|
BenBE
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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.
      
Beiträge: 1766
Win 7
D7 PE
|
Verfasst: 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
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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:  Informationen über Lagged Fibonacci Generatoren.
Zuletzt bearbeitet von delfiphan am Sa 14.05.05 21:08, insgesamt 1-mal bearbeitet
|
|
zemy
      
Beiträge: 207
Win XP Prof.
D7
|
Verfasst: 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: www.math.sci.hiroshi...p/~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..
_________________ LifeIsToShortToThinkAboutTheShortness
|
|
hallo
      
Beiträge: 450
WIN XP, SuSE 9.3
D3 Prof, D6 Pers, 2005 Pers
|
Verfasst: 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!!!
_________________ Der beste je Programmierte Trojaner: Windows XP
Wäre es nicht adequat, den Usus heterogener Termini zu minimieren?
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 450
WIN XP, SuSE 9.3
D3 Prof, D6 Pers, 2005 Pers
|
Verfasst: Do 09.06.05 16:30
Achsooo! Ok, ich werds nicht mehr vergessen!!! 
_________________ Der beste je Programmierte Trojaner: Windows XP
Wäre es nicht adequat, den Usus heterogener Termini zu minimieren?
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 09.06.05 16:46
Steht aber auch in der Hilfe. Musst du dir also nicht unbedingt merken. 
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: 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
      
Beiträge: 450
WIN XP, SuSE 9.3
D3 Prof, D6 Pers, 2005 Pers
|
Verfasst: Do 09.06.05 17:35
Wenn man übrigens aus einer Zahl eine Zufallszahl BERECHNEN will, dann macht man einfach
Quelltext
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!
_________________ Der beste je Programmierte Trojaner: Windows XP
Wäre es nicht adequat, den Usus heterogener Termini zu minimieren?
|
|
F34r0fTh3D4rk
      
Beiträge: 5284
Erhaltene Danke: 27
Win Vista (32), Win 7 (64)
Eclipse, SciTE, Lazarus
|
Verfasst: Do 09.06.05 18:43
wieso des ? und was ist zahl ?
|
|
delfiphan
      
Beiträge: 2684
Erhaltene Danke: 32
|
Verfasst: 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
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: So 12.06.05 13:10
@hallo:aber dann sollte sich doch zahl verhändern oder nicht ?
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|