| Autor |
Beitrag |
*Knust*
      
Beiträge: 95
|
Verfasst: Mi 19.09.07 13:52
Hi!
Ich habe in nem Programm die Zeilen
Delphi-Quelltext 1: 2:
| randomize; x:=random(bla[a,b])+1; |
wobei bla ein integer-array ist und a und b variablen... bla ist an der posotion nicht 0...
Trotzdem bekomme ich immer 1 als x wert raus...WARUM????
mit freundlichen Grüßen
Knust
Moderiert von Gausi: Topic aus Off Topic verschoben am Mi 19.09.2007 um 15:04
Moderiert von Tino: Delphi-Tags hinzugefügt.
|
|
noidic
      
Beiträge: 851
Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
|
Verfasst: Mi 19.09.07 13:55
Wie auch der Hilfe zu entnehmen ist, sollte randomize nur ein mal beim start des Programms aufgerufen und keinesfalls bei jedem random-Aufruf.
_________________ Bravery calls my name in the sound of the wind in the night...
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Mi 19.09.07 13:58
noidic hat folgendes geschrieben: | | Wie auch der Hilfe zu entnehmen ist, sollte randomize nur ein mal beim start des Programms aufgerufen und keinesfalls bei jedem random-Aufruf. |
"Sollte" meint aber hier sowas wie 'muss nur' und nicht 'darf nur'. Du kannst natürlich Randomize vor jedem Aufruf von Random auch noch mal aufrufen, bringt aber nix.
Random (X) liefert eine Zahl zwischen 0 und X-1.
Bitte nochmal sicherstellen, das bla[a,b]>1 ist.
_________________ Na denn, dann. Bis dann, denn.
|
|
r2c2
      
Beiträge: 324
Erhaltene Danke: 2
Linux
|
Verfasst: Mi 19.09.07 14:11
alzaimar hat folgendes geschrieben: | noidic hat folgendes geschrieben: | | Wie auch der Hilfe zu entnehmen ist, sollte randomize nur ein mal beim start des Programms aufgerufen und keinesfalls bei jedem random-Aufruf. |
"Sollte" meint aber hier sowas wie 'muss nur' und nicht 'darf nur'. Du kannst natürlich Randomize vor jedem Aufruf von Random auch noch mal aufrufen, bringt aber nix.
|
Jein. Mach das mal in ner Schleife und du erhälst u.U. immer die selben Werte, da der Seed an QueryPerformanceCounter oder wenn der nicht vorhanden ist an GetTickCount gekoppelt ist ==> Seed immer gleich ==> 1. Pseudozufallszahl immer gleich...
mfg
Christian
_________________ Kaum macht man's richtig, schon klappts!
|
|
*Knust* 
      
Beiträge: 95
|
Verfasst: Mi 19.09.07 14:45
hmm...
ich habe jetzt das randomize; aus der Schleife rausgenommen...
Jetzt steht da nur das random(...);
der Wert, aus dem "geradomt" wird ist auch positiv...
Trotzdem kommt da immer 1 raus...
|
|
uall@ogc
      
Beiträge: 1826
Erhaltene Danke: 11
Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
|
Verfasst: Mi 19.09.07 15:34
@Knust: bla[a,b] muss großer als 1 sein. wenn bla[a,b] = 1 dann gibt random immer 0 zurück
@r2c2: da die Zeit weiterläuft wirst du nicht den selben Wert immer erhalten. nur die Gleichverteilung der Zahlen ist dann nicht mehr gewährleistet
_________________ wer andern eine grube gräbt hat ein grubengrabgerät
- oder einfach zu viel zeit
|
|
r2c2
      
Beiträge: 324
Erhaltene Danke: 2
Linux
|
Verfasst: Fr 21.09.07 08:46
uall@ogc hat folgendes geschrieben: |
@r2c2: da die Zeit weiterläuft wirst du nicht den selben Wert immer erhalten. nur die Gleichverteilung der Zahlen ist dann nicht mehr gewährleistet |
Wie schon erwähnt: Wenn kein QueryPerformanceCounter da ist, wird GetTickCount verwendet. Und da auf heutigen Systemen die meisten Schleifen in 1ms mehrmals durchlaufen werden...
mfg
Christian
_________________ Kaum macht man's richtig, schon klappts!
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 21.09.07 09:04
*Knust* hat folgendes geschrieben: | Jetzt steht da nur das random(...);
der Wert, aus dem "geradomt" wird ist auch positiv...
Trotzdem kommt da immer 1 raus... |
Schreib mal bitte Delphi-Quelltext 1: 2: 3:
| ShowMessage('Wert: ' + IntToStr(bla[a,b])); x := Random(bla[a,b]) + 1; ShowMessage('Zufallswert: ' + IntToStr(x)); | Und dann sag mal, was da angezeigt wird...
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 21.09.07 09:20
r2c2 hat folgendes geschrieben: | alzaimar hat folgendes geschrieben: | ... Du kannst natürlich Randomize vor jedem Aufruf von Random auch noch mal aufrufen, bringt aber nix.
|
Jein. Mach das mal in ner Schleife und du erhälst u.U. immer die selben Werte, da der Seed an QueryPerformanceCounter oder wenn der nicht vorhanden ist an GetTickCount gekoppelt ist ==> Seed immer gleich ==> 1. Pseudozufallszahl immer gleich.... |
Schon probiert?  Die Zeit verändert sich doch, und damit der Seed. Nur eben u.U. deterministisch bzw. bei mehreren Aufrufen hintereinander nicht.
_________________ Na denn, dann. Bis dann, denn.
|
|
r2c2
      
Beiträge: 324
Erhaltene Danke: 2
Linux
|
Verfasst: Fr 21.09.07 09:30
alzaimar hat folgendes geschrieben: |
Schon probiert? Die Zeit verändert sich doch, und damit der Seed. Nur eben u.U. deterministisch bzw. bei mehreren Aufrufen hintereinander nicht. |
Ich hab n QueryPerformanceCounter ==> Ich kann es gar nicht testen...
mfg
christian
_________________ Kaum macht man's richtig, schon klappts!
|
|
alzaimar
      
Beiträge: 2889
Erhaltene Danke: 13
W2000, XP
D6E, BDS2006A, DevExpress
|
Verfasst: Fr 21.09.07 09:33
[quote=" r2c2"] alzaimar hat folgendes geschrieben: |
Ich hab n QueryPerformanceCounter ==> Ich kann es gar nicht testen... |
Pah, Ausrede.  Na dann eben:
Delphi-Quelltext 1: 2: 3: 4:
| While True do begin RandSeed := GetTickCount; Memo1.lines.add (Rand(100)); End; |
Gibt sehr viel gleiche (hast ja recht, menno) Zahlen, aber eben <klugscheiss>nicht immer</klugscheiss>.
_________________ Na denn, dann. Bis dann, denn.
|
|
TProgger
      
Beiträge: 148
XP
D6, D2007 prof
|
Verfasst: Fr 21.09.07 12:08
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Fr 21.09.07 12:28
Wozu? Das ist doch gar kein Problem, wenn man Randomize richtig verwendet. Die Diskussion dreht sich ja gerade um die Auswirkungen einer falschen Verwendung, und da man das sowieso eigentlich nicht macht, erübrigt es sich da auch, zu überlegen, wie man das wieder ausbügelt.
|
|