![]() |
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:
Bei den Punkten werden die Aktien erhöht bzw. runtergesezt !!!
updown := random(2)+1;
if updown = 1 then ... else ... Wie mache ich es, dass die Aktien nicht zu weit nach oben bzw. nach unten gehen ??? ByStones |
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ß |
Re: Echte Zufallszahl
Zitat:
|
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:
Ist zwar och noch nicht perfekt, aber besser als nüschts :mrgreen:
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; |
Re: Echte Zufallszahl
Zitat:
|
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 ... |
Re: Echte Zufallszahl
Zitat:
Zitat:
da wo auch
Delphi-Quellcode:
ist
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; |
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:
Baue diese Funktion am Besten nicht direkt in TForm1 ein ... einfach nur vor die ersten Funktionen (nach "implementation")
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; 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:
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,
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; auch wenn diese Reihe durch den Aufruf von Randomize immer mal an 'ner anderen Stelle beginnt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 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