Autor Beitrag
*Knust*
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95



BeitragVerfasst: Mi 19.09.07 13:52 
Hi!
Ich habe in nem Programm die Zeilen

ausblenden 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 user profile iconGausi: Topic aus Off Topic verschoben am Mi 19.09.2007 um 15:04
Moderiert von user profile iconTino: Delphi-Tags hinzugefügt.
noidic
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 851

Win 2000 Win XP Vista
D7 Ent, SharpDevelop 2.2
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Mi 19.09.07 13:58 
user profile iconnoidic 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 324
Erhaltene Danke: 2

Linux

BeitragVerfasst: Mi 19.09.07 14:11 
user profile iconalzaimar hat folgendes geschrieben:
user profile iconnoidic 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* Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 95



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1826
Erhaltene Danke: 11

Win 2000 & VMware
Delphi 3 Prof, Delphi 7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 324
Erhaltene Danke: 2

Linux

BeitragVerfasst: Fr 21.09.07 08:46 
user profile iconuall@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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 21.09.07 09:04 
user profile icon*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
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 21.09.07 09:20 
user profile iconr2c2 hat folgendes geschrieben:
user profile iconalzaimar 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? :wink: 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
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 324
Erhaltene Danke: 2

Linux

BeitragVerfasst: Fr 21.09.07 09:30 
user profile iconalzaimar hat folgendes geschrieben:

Schon probiert? :wink: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 21.09.07 09:33 
[quote="user profile iconr2c2"]
user profile iconalzaimar hat folgendes geschrieben:

Ich hab n QueryPerformanceCounter ==> Ich kann es gar nicht testen...

Pah, Ausrede. :mrgreen: Na dann eben:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 148

XP
D6, D2007 prof
BeitragVerfasst: Fr 21.09.07 12:08 
dann merkt man sich eben die vorher gezogene Zahl und zieht so lange, bis sie anders ist :)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
begin
  x:=y;
  while x=y do x:=Random(irgendwas);
  y:=x;
end;
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.