Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Randomize mehrmals starten (https://www.delphipraxis.net/104183-randomize-mehrmals-starten.html)

mimi 29. Nov 2007 18:24

Re: Randomize mehrmals starten
 
ach ? kannst du dazu mal ein kleines beispiel machen ?

Bei einem Spiel währe das bestimmt nicht besonder schlimm kommt aber auf das Spiel an.
mir ist aufgefallen wenn man Random in einem Timer aufruft zählt er nur hoch......

sirius 29. Nov 2007 18:27

Re: Randomize mehrmals starten
 
Zitat:

Zitat von Dax
Es ist nicht gut. Wenn du das mehrmals machst, wird der Zufallsgenerator mehrmals neu initialisiert, und da Randomize auf Basis von GetTickCount und damit im Millisekunden-Bereich arbeitet... Nun, am besten ein Beispiel.
Delphi-Quellcode:
var a: Integer;

Randomize;
a := Random(1000);
Randomize;
a := a - Random(1000);
a wird nahezu immer 0 sein, da der Zufallsgenerator zwei mal initialisiert wird, und dies wahrscheinlich mit dem selben Seed (4 Calls brauchen keine Millisekunde)...

Naja fast richtig. für solche Leute wie dich, hat sich Borland auch etwas ausgedacht und nimmt deswegen statt gettickcount QueryPerformancCounter. Da wird etwas fixer gezählt.
Du kannst diese Demonstration aber durchführen indem du die globale Variable RandSeed von Hand belegst.

Dax 29. Nov 2007 18:31

Re: Randomize mehrmals starten
 
Zitat:

Zitat von sirius
Naja fast richtig. für solche Leute wie dich, hat sich Borland auch etwas ausgedacht und nimmt deswegen statt gettickcount QueryPerformancCounter. Da wird etwas fixer gezählt.
Du kannst diese Demonstration aber durchführen indem du die globale Variable RandSeed von Hand belegst.

Ja, etwas mit den QP-Funktionen hatte ich noch im Hinterkopf, hatte es aber mit einem anderen Teil der RTL assoziert (nur warum?).

Neotracer64 29. Nov 2007 19:08

Re: Randomize mehrmals starten
 
Vielleicht ist es ja für einige interessant. :)
Hab das gerade mit OllyDbg rausgefunden.
Zumindest ist das so bei Delphi 7 Enterprise. (Build 4.453)

Delphi-Quellcode:
function PredictNextRandom(RSeed: PInteger; Range: Integer): Integer;
begin
  result := RSeed^ * $8088405 + 1;
  asm
    PUSH EDX
    MOV EAX, Range
    MUL result
    MOV result, EDX
    POP EDX
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  Randomize;
  ShowMessage(IntToStr(PredictNextRandom(@RandSeed,10)) + ' == '+ IntToStr(Random(10)));
  ShowMessage(IntToStr(PredictNextRandom(@RandSeed,10)) + ' == '+ IntToStr(Random(10)));
  ShowMessage(IntToStr(PredictNextRandom(@RandSeed,10)) + ' == '+ IntToStr(Random(10)));
  ShowMessage(IntToStr(PredictNextRandom(@RandSeed,10)) + ' == '+ IntToStr(Random(10)));
  ShowMessage(IntToStr(PredictNextRandom(@RandSeed,10)) + ' == '+ IntToStr(Random(10)));
  ShowMessage(IntToStr(PredictNextRandom(@RandSeed,10)) + ' == '+ IntToStr(Random(10)));
  ShowMessage(IntToStr(PredictNextRandom(@RandSeed,10)) + ' == '+ IntToStr(Random(10)));
end;
Zitat:

Das ist gut, weil man sonst (wenn Randomize nur einmal aufgerufen wird) unter bestimmten Voraussetzungen ohne große Probleme vorhersagen kann, welches die nächste "Zufallszahl" ist, wenn die ersten paar "Zufallszahlen" bekannt sind.
PredictNextRandom, sagt die nächste Pseudozufallszahl IMMER voraus, egal wie häufig Randomize aufgerufen wurde. :D
Also im Prinzip egal, bzw. eher überflüssig Randomize häufiger aufzurufen.

alzaimar 29. Nov 2007 19:56

Re: Randomize mehrmals starten
 
Zitat:

Zitat von sirius
Naja fast richtig. für solche Leute wie dich, hat sich Borland auch etwas ausgedacht und nimmt deswegen statt gettickcount QueryPerformancCounter.

Naja, fast richtig. :mrgreen:
Bei Delphi 6 sehe ich in der System.Pas das hier
Delphi-Quellcode:
Procedure Randomize;
...
    CALL   GetSystemTime
...
Aber die CodeGear-Fuzzis haben doch etwas verändert, denn bei BDS2006 sehe ich das hier
Delphi-Quellcode:
Procedure Randomize;
...
if QueryPerformanceCounter(Counter) then
Zitat:

Zitat von Amateurprofi
Das ist gut, weil man sonst (wenn Randomize nur einmal aufgerufen wird) unter bestimmten Voraussetzungen ohne große Probleme vorhersagen kann, welches die nächste "Zufallszahl" ist, wenn die ersten paar "Zufallszahlen" bekannt sind.

Nun ja. Dann verwendet man aber eben nicht den Delphi-PRG, sondern einen etwas sicherererern, z.B. den Twister.

sirius 29. Nov 2007 20:34

Re: Randomize mehrmals starten
 
Zitat:

Zitat von Neotracer64
Hab das gerade mit OllyDbg rausgefunden.

Mit OllyDbg :gruebel: , man kann auch einfach in die System.Pas schauen ("_RandInt" zum Beispiel).


Zitat:

Zitat von alzaimar
Naja, fast richtig. :mrgreen:

:P

Neotracer64 29. Nov 2007 20:43

Re: Randomize mehrmals starten
 
Ne. Bei mir springt er immer auf "Unit System", wenn ich auf Random() "Strg+Mausklick" draufklicke.

EDIT: Ahh, jetz seh ichs. Wie biste auf RandInt_ gekommen. Einfach durchgekramt? :S

himitsu 29. Nov 2007 21:03

Re: Randomize mehrmals starten
 
Zitat:

Zitat von Neotracer64
EDIT: Ahh, jetz seh ichs. Wie biste auf RandInt_ gekommen. Einfach durchgekramt? :S

Gesucht? Der Delphi-Debugger verrät einem auch Dank der Debuginfos welche Funktion genau aufgerufen wird.
In diesem Fall RandInt und da die SystemInt etwas besonderes ist (PAS stimmt nicht mit ganz DCU überein), ist hier auch der Funktionsname nicht ganz stimmig, aber soein _ stört bei 'ner Suche ja nicht so sehr.

Und wen es interessiert, hier nochmal alles in Pascal
> http://www.delphipraxis.net/internal...=450466#450466
und die vorheriggen Seiten sind wohl auch nicht sooo uninteressant :angel:

sirius 29. Nov 2007 21:08

Re: Randomize mehrmals starten
 
Zitat:

Zitat von Neotracer64
Ne. Bei mir springt er immer auf "Unit System", wenn ich auf Random() "Strg+Mausklick" draufklicke.

EDIT: Ahh, jetz seh ichs. Wie biste auf RandInt_ gekommen. Einfach durchgekramt? :S

Du hast noch nicht häufig in der System.Pas gesucht :zwinker:

Neotracer64 29. Nov 2007 21:14

Re: Randomize mehrmals starten
 
*Autsch*
Danke ihr beiden.
Ich habe bis jetzt wirklich immer gedacht, alle diese Funktionen seien hardcoded im Compiler drin. oh wee oh wee.
Den Delphi Debugger benutze ich nicht so gerne, da bin ich zu sehr an Olly gewöhnt. :cyclops:


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:44 Uhr.
Seite 2 von 3     12 3      

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