Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Echte Zufallszahl (https://www.delphipraxis.net/71062-echte-zufallszahl.html)

ByStones2 8. Jun 2006 10:41


Echte Zufallszahl
 
Hi,
ich wollte in Delphi mal Zufallszahlen erzeugen um damit Aktien zu simmulieren, doch mir ist aufgefallen, dass die Aktien mit 100%er sicherheit ins minus gehen !!! Sie gehen ein bisschen hoch und dann ab in den Keller !!!
Das sind dann doch keine echten zufallszahlen !!!
Mein COde sieht so aus:
Delphi-Quellcode:
updown := random(2)+1;
if updown = 1 then
...
else
...
Bei den Punkten werden die Aktien erhöht bzw. runtergesezt !!!
Wie mache ich es, dass die Aktien nicht zu weit nach oben bzw. nach unten gehen ???

ByStones

domsch 8. Jun 2006 10:43

Re: Echte Zufallszahl
 
Hi,


nutze Randomize().

Einmal beim Laden der Unit Randomize() ausführen und du bekommst "richtige" zufallszahlen.

Randomize stellt dann für Random das so ein, das Random die Zahl anhand der Aktuellen Uhrzeit/datum ermittelt

Funktioniert jedenfalls viel besser als nur Random!


Gruß

ByStones2 8. Jun 2006 10:48

Re: Echte Zufallszahl
 
Zitat:

Zitat von domsch
Hi,


nutze Randomize().

Einmal beim Laden der Unit Randomize() ausführen und du bekommst "richtige" zufallszahlen.

Randomize stellt dann für Random das so ein, das Random die Zahl anhand der Aktuellen Uhrzeit/datum ermittelt

Funktioniert jedenfalls viel besser als nur Random!


Gruß

danke ich werds mal probieren !!!

himitsu 8. Jun 2006 10:50

Re: Echte Zufallszahl
 
Na ja, er bekommt dann richtige Pseudozufallszahlen ^^

Natürlich hier auch das Randomize beim Programmstart nicht vergessen, da es auf den "normalen" Zufallsfunktionen aufsetzt.
Delphi-Quellcode:
Function Random(Range: LongInt): LongInt;
  Begin
    RandSeed := RandSeed * 134775813 + ((GetTickCount and 3) or 1;

    //Result := Int64(Range) * LongWord(RandSeed) div Int64($100000000);
    Result := Int64(Int64(Range) * LongWord(RandSeed)) shr 32;
   End;
Ist zwar och noch nicht perfekt, aber besser als nüschts :mrgreen:

ByStones2 8. Jun 2006 10:54

Re: Echte Zufallszahl
 
Zitat:

Zitat von himitsu
Na ja, er bekommt dann richtige Pseudozufallszahlen ^^

Natürlich hier auch das Randomize beim Programmstart nicht vergessen, da es auf den "normalen" Zufallsfunktionen aufsetzt.
Delphi-Quellcode:
Function Random(Range: LongInt): LongInt;
  Begin
    RandSeed := RandSeed * 134775813 + ((GetTickCount and 3) or 1;

    //Result := Int64(Range) * LongWord(RandSeed) div Int64($100000000);
    Result := Int64(Int64(Range) * LongWord(RandSeed)) shr 32;
   End;
Ist zwar och noch nicht perfekt, aber besser als nüschts :mrgreen:

wie kann ich das dann einbauen ???

himitsu 8. Jun 2006 11:07

Re: Echte Zufallszahl
 
Einfach nur in dein Programm kopieren, wobei es eventuell besser ist, wenn du diese Funktion etwas umbenennst.
Und dann statt der "standardmäßigen" Random-Funktion verwenden.


Bei mir heißt diese Funktion z.B. RandomC.
Delphi-Quellcode:
Procedure RandomC(Range: LongInt): LongInt;

Delphi-Quellcode:
updown := RandomC(2) + 1;
if updown = 1 then
...
else
...

ByStones2 8. Jun 2006 11:14

Re: Echte Zufallszahl
 
Zitat:

Zitat von himitsu
Einfach nur in dein Programm kopieren, wobei es eventuell besser ist, wenn du diese Funktion etwas umbenennst.
Und dann statt der "standardmäßigen" Random-Funktion verwenden.


Bei mir heißt diese Funktion z.B. RandomC.
Delphi-Quellcode:
Procedure RandomC(Range: LongInt): LongInt;

Delphi-Quellcode:
updown := RandomC(2) + 1;
if updown = 1 then
...
else
...

Zitat:

[Warning] MainUnit.pas(183): W1024 Combining signed and unsigned types - widened both operands
[Warning] MainUnit.pas(203): W1035 Return value of function 'TForm1.rechnen' might be undefined
[Error] MainUnit.pas(159): E2065 Unsatisfied forward or external declaration: 'TForm1.RandomC'
[Fatal Error] Tycoon.dpr(5): F2063 Could not compile used unit 'MainUnit.pas'
Dabei wird die function-Zeile pben bei den anderen functions rot !!!
da wo auch
Delphi-Quellcode:
    procedure GeldTimerTimer(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    function rechnen(zahl1, zahl2, zahl3 :double): double;
ist

himitsu 8. Jun 2006 11:28

Re: Echte Zufallszahl
 
OK, hab mal noch 'ne Umwandlung zwischen Integer und Cardinal reingemacht ... die "unsigned"-Warnung sollte nun weg sein (tja, das kommt davon, wenn ASM bei sowas nicht meckert -.-'')

Delphi-Quellcode:
Function Random(Range: LongInt): LongInt;
  Begin
    RandSeed := RandSeed * 134775813 + LongInt(((GetTickCount and 3) or 1);

    //Result := Int64(Range) * Int64(LongWord(RandSeed)) div Int64($100000000);
    Result := Int64(Int64(Range) * Int64(LongWord(RandSeed))) shr 32;
   End;
Baue diese Funktion am Besten nicht direkt in TForm1 ein ... einfach nur vor die ersten Funktionen (nach "implementation")

Die anderen Fehler scheinen mir daran zu liegen, daß du nur die Funktion in TForm1 definiert, aber die Funktion selber nicht richtig, oder garnicht im Implementations-Abschnitt eingebaut wurde.












PS: in Delphi selber sind die Funktionen etwa so in der System-Unit definiert.
Delphi-Quellcode:
Var RandSeed: LongInt;

Procedure Randomize;
  Var Count: LargeInt;

  Begin
    If QueryPerformanceCounter(Count) Then RandSeed := Count
    Else RandSeed := GetTickCount;
  End;

Function Random(Range: LongInt): LongInt; Overload;
  // Borland Delphi v7.0 Build 4453 
  Begin
    RandSeed := RandSeed * 134775813 + 1;
    //Result := LargeInt(Range) * LongWord(RandSeed) div LargeInt($100000000);
    Result := TLargeIntRec(LargeInt(Range) * LongWord(RandSeed)).Hi;
  End;

Function Random: Extended; Overload;
  // Borland Delphi v7.0 Build 4453 
  Begin
    RandSeed := RandSeed * 134775813 + 1;
    //Result := 1.0 * LongWord(RandSeed) / LargeInt($100000000);
    Result := LongWord(RandSeed) / LargeInt($100000000);
  End;
Wenn du dort genau hinsieht, dann wird du bemerken, daß beim Aufruf von Random der Wert rein mathematisch erechnet wird und somit in Wirklichkeit auch wieder eine fest definierte Zahlenreihe entsteht,
auch wenn diese Reihe durch den Aufruf von Randomize immer mal an 'ner anderen Stelle beginnt.


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

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