AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Echte Zufallszahl

Ein Thema von ByStones2 · begonnen am 8. Jun 2006 · letzter Beitrag vom 8. Jun 2006
Antwort Antwort
ByStones2

Registriert seit: 6. Okt 2005
Ort: Birenbach
133 Beiträge
 
Turbo Delphi für Win32
 
#1

Echte Zufallszahl

  Alt 8. Jun 2006, 10:41
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
Wer nämlich mit "h" schreibt ist dämlich.
  Mit Zitat antworten Zitat
domsch

Registriert seit: 15. Apr 2006
Ort: Paderborn
21 Beiträge
 
Delphi 2006 Enterprise
 
#2

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 10:43
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ß
Dominik
Absoluter Delphi Newbie
  Mit Zitat antworten Zitat
ByStones2

Registriert seit: 6. Okt 2005
Ort: Birenbach
133 Beiträge
 
Turbo Delphi für Win32
 
#3

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 10:48
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 !!!
Wer nämlich mit "h" schreibt ist dämlich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#4

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 10:50
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
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ByStones2

Registriert seit: 6. Okt 2005
Ort: Birenbach
133 Beiträge
 
Turbo Delphi für Win32
 
#5

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 10:54
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
wie kann ich das dann einbauen ???
Wer nämlich mit "h" schreibt ist dämlich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#6

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 11:07
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.
Procedure RandomC(Range: LongInt): LongInt;
Delphi-Quellcode:
updown := RandomC(2) + 1;
if updown = 1 then
...
else
...
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
ByStones2

Registriert seit: 6. Okt 2005
Ort: Birenbach
133 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 11:14
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.
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
Wer nämlich mit "h" schreibt ist dämlich.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#8

Re: Echte Zufallszahl

  Alt 8. Jun 2006, 11:28
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.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:37 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