Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Random (https://www.delphipraxis.net/4772-random.html)

nailor 11. Mai 2003 15:48


Random
 
Ich habe nichts gefunden, also die Frage: gibts in den unendlichen Weiten der API einen Befehl, der halbwegs vernünftig ein zufälliges Ergebnis zurückgibt?

sakura 11. Mai 2003 15:58

Was ist das Problem mit dem Standard-Delphi Befehl Random. Wenn es nicht gerade um Top-Security Anwendungen geht, sollte der doch zufällig genug sein, oder?

...:cat:...

nailor 11. Mai 2003 17:00

*selber-hau* !!!

sakura 11. Mai 2003 17:05

Zitat:

Zitat von Nailor
*selber-hau* !!!

:lol:

Vergiß nicht den einmaligen Aufruf von Randomize, damit nicht bei jedem Programmstart der gleiche Zufall kommt.

...:cat:....

nailor 11. Mai 2003 18:21

Vielen Dank für diesen netten Hinweis. Man kann übrigens Randomize auch öfter aufrufen, wenn man immer mit einer davor erzeugten Zufallszahl den Seed neu setzt... :freak:

sakura 11. Mai 2003 18:27

Zitat:

Zitat von Nailor
Vielen Dank für diesen netten Hinweis. Man kann übrigens Randomize auch öfter aufrufen, wenn man immer mit einer davor erzeugten Zufallszahl den Seed neu setzt... :freak:

Öhmm, falsch. Ja man kann den Wert setzen, aber dieses macht keinen Unterschied. Es wird die aktuelle Uhrzeit genutzt. Deshalb kann es bei mehreren Aufrufen auch zu Problemen kommen. Von daher gilt die Faustregel: nur einmal beim Programmstart aufrufen. Hier mal der Source-Code zu Randomize, daran fällt auf, daß der Wert von RandSeed keine Rolle spielt, er wird einfach nur gesetzt (letzte Zeile).
Delphi-Quellcode:
procedure      Randomize;
var
        systemTime :
        record
                wYear  : Word;
                wMonth : Word;
                wDayOfWeek     : Word;
                wDay   : Word;
                wHour  : Word;
                wMinute : Word;
                wSecond : Word;
                wMilliSeconds: Word;
                reserved       : array [0..7] of char;
        end;
asm
        LEA    EAX,systemTime
        PUSH   EAX
        CALL   GetSystemTime
        MOVZX  EAX,systemTime.wHour
        IMUL   EAX,60
        ADD    AX,systemTime.wMinute  { sum = hours * 60 + minutes   }
        IMUL   EAX,60
        XOR    EDX,EDX
        MOV    DX,systemTime.wSecond
        ADD    EAX,EDX                { sum = sum * 60 + seconds             }
        IMUL   EAX,1000
        MOV    DX,systemTime.wMilliSeconds
        ADD    EAX,EDX                { sum = sum * 1000 + milliseconds      }
        MOV    RandSeed,EAX
end;
...:cat:...

Stanlay Hanks 11. Mai 2003 19:19

ähhmm...kann mir wer erklähren, was ein seed is??? *Schähmtsichweilerdasnichtweiß* :oops:

sakura 11. Mai 2003 19:34

Genaugenommen ein Samen. In diesem Fall ist es der Anfang einer Serie von Pseudo-Zufallszahlen.

...:cat:...

Stanlay Hanks 11. Mai 2003 19:49

Samen...achso :mrgreen: . Danke, es heißt praktisch, ab der Aufrufstelle werden wieder neue Zufallszahlen gebildet, was aber eigentlich keine Wirkung hat, weil sie ja eh schon zufällig sind, oder? :wink:

sakura 11. Mai 2003 19:53

Nicht ganz. Die RandSeed Variable wird zur Berechnung der nächsten Pseudo-Zufallszahl herangezogen. Deshalb auch Pseudo, ein Computer kann nicht wirklich Zufallszahlen ermitteln. Es ist immer Mathe dahinter.

...:cat:...

Stanlay Hanks 11. Mai 2003 20:00

Schon wieder was gelernt. Also macht der PC an sich das gar nicht...hab ich auch nich gewusst. Danke für die schnelle Antwort.

Man liest sich, Stanlay 8)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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