Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Random? (https://www.delphipraxis.net/12705-random.html)

Killer 2. Dez 2003 18:02


Random?
 
Hi ich hab ein Problem mit dem Zufallsgenerator. Und zwar gehts drum, dass ich bei jedem Aufruf der Funktion einen anderen Wert haben möchte. Mein Quellcode:
Delphi-Quellcode:
procedure TForm1.Random;
begin
 Randomize;
 DBListBox1.ItemIndex := RandomRange(0,DBListBox1.Items.Count-1);
 varia := DBListBox1.Items[DBListBox1.ItemIndex];
end;
Zur Erklärung: varia ist eine lokale Stringvariable, in den ich den selektierten Wert der ListBox hineinkopiere, um ihn weiterzuverwenden. Naja nur kommt halt jedes mal der gleiche Wert raus. Wieso??? :(

phlux 2. Dez 2003 18:11

Re: Random?
 
Randomize nur einmal aufrufen am Besten im OnCreate der Form oder im Initialization Teil deines Progs ;)

Killer 2. Dez 2003 18:12

Re: Random?
 
Hm das bringt mir aber nicht viel, da ich die Funktion per Button aufrufen möchte. Gehts nicht auch anders? :?:

himitsu 2. Dez 2003 18:12

Re: Random?
 
Normalerweis leitet Randomize den Startwert (RandSeed) einen aus der Systemzeit abgeleiteten Wert zu, was eigendlich bedeutet das die 1. Zufallszahl "jedesmal" eine Andere sein sollte.

Aber vesuche mal Randomize nicht in deiner Zufallsfunktion auszuführen, sondern nur einmal im OnCreate-Ereignis deines Formulars.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Frank Bicking 2. Dez 2003 18:13

Re: Random?
 
Liegt am Randomize, führe dies nur einmal aus, z.B. direkt nach Programmstart.

Killer 2. Dez 2003 18:16

Re: Random?
 
Hm nee kann nicht sein, habs in das OnCreate der Form reingemacht und will trotzdem nicht. Komischerweise beim 1ten Aufruf geht die Funktion immer :?:

himitsu 2. Dez 2003 18:22

Re: Random?
 
Und so:
Delphi-Quellcode:
Procedure TForm1.FormCreate(Sender: TObject);
  Begin
    Randomize;
  End;

Procedure TForm1.Random;
  Begin
    DBListBox1.ItemIndex := Random(DBListBox1.Items.Count);
    varia := DBListBox1.Items[DBListBox1.ItemIndex];
  End;
http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

scp 2. Dez 2003 18:24

Re: Random?
 
Mit grosser warscheinlichkeit liegt es daran, das deine Prozedur Random heisst. Das beisst sich mit einer Delphi-Funktion, die genauso heisst. Bennen sie mal um in LBRandom oder so und teste es nochmal.

Killer 2. Dez 2003 18:29

Re: Random?
 
@himitsu:

Hab ich probiert geht nicht!

@scp:

Geht auch nicht. Hab sie überall umbenannt.

Schon komisch, wie gesagt beim 1ten Aufruf gehts, da kommt wirklich ne Zufallszahl, beim 2ten Aufruf aber nicht. :cry:

himitsu 2. Dez 2003 18:34

Re: Random?
 
@scp:
die Prozedur Random ist ja in der Klassen TForm1 und kann sich normalerweise nich mir der Funktion Random überschneiden.

@Killer:
wenn möglich stell doch mal etwas mehr von deinem Code zur Verfügung.
Vieleicht wird ja was anderes wichtiges überseh'n.

http://www.delphipraxis.net/images/common/divider.jpg
http://www.FrankNStein.de/Smiley-Kuss.gif * * http://www.FrankNStein.de/Smiley-Spinne.gif * * * http://www.FrankNStein.de/Smiley-Winken.gif

Killer 2. Dez 2003 18:51

Re: Random?
 
Hm der iss relativ umfangreich. Ich kann aber mal die wichtigsten Funktionen reinschreiben:
OnCreate:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 DBListBox1.Items.Clear;
 FillBox;
 Randomize;
 while not ADOQuery1.Eof do begin
  DBListBox1.Items.Add(ADOQuery1.FieldByName('german').AsString);
  ADOQuery1.Next
end;
end;
FillBox ist eine Funktion zum Einfügen der DBListBox Items!

LBRandom (Randomfunktion):
Delphi-Quellcode:
procedure TForm1.LBRandom;
begin
 DBListBox1.ItemIndex := Random(DBListBox1.Items.Count);
 varia := DBListBox1.Items[DBListBox1.ItemIndex];
end;
1ter Aufruf der Funktion:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
begin
 LBRandom;
 KWizardWelcomePage3.Show;
 KWizardWelcomePage3.VisibleButtons := [bkNext,bkFinish];
end;
KWizard iss ne VCL.

2ter Aufruf der Funktion:
Delphi-Quellcode:
procedure TForm1.KWizardWelcomePage3NextButtonClick(Sender: TObject;
  var Stop: Boolean);
begin
 if KWizardWelcomePage3.VisibleButtons = [bkBack,bkNext,bkFinish] then
 KWizardWelcomePage1.Show else LBRandom;
end;
Hm das war jetzt eigentlich das wichtigste...

XeRo 6. Dez 2003 13:49

Re: Random?
 
Du kannst ja auch versuchen andere faktoren mitein zu berechnen.
ZB die momentane Zeit oder das Datum:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
 var i,randomzahl:Integer;
begin
For i:=1 to StrToInt(Copy(TimeToStr(now),7,2)) do
 begin
  Randomize;
 end;

RandomZahl:=Random(100);
end;
So ist die gefahr, dass immer das selbe herauskommt nur noch 1/60.

Du kannst ja auch andere faktoren miteinberechnen. Datum, wochentag,...
je mehr desto besser.
Allerdings sollte die schleife nicht zu lange werden.

axelf98 6. Dez 2003 13:55

Re: Random?
 
Hmm, es macht doch keinen Sinn 60 Mal hintereinander "randomize" aufzurufen, oder?
Der Befehl geht von der Systemzeit aus und berechnet daraus Zufallzahlen. Wenn man allerdings 60 Mal mit der gleichen Zeit macht (ungefähr) kommt am ende das gleiche raus, wie als wenn man das nur 1 mal macht, nämlich Zufallszahlen!

Es reicht den Befehl im OnCreate einmal aufzuführen.

Übrigens: Wenn man auf random(x) zugreift, ohne vorher randomize aufzurufen, werden bei jedem Programmstart die gleichen Zufallszahlen ausgeworfen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:10 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz