AGB  ·  Datenschutz  ·  Impressum  







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

randomize result ???

Ein Thema von czapie · begonnen am 10. Jan 2003 · letzter Beitrag vom 11. Jan 2003
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#11
  Alt 10. Jan 2003, 19:51
Stimmt, das ist aus den Uhrzeiten, aber nicht bloss 386er, sondern schon die 086er. Aber der Zeitgeber hat sich seit dem gehalten. Basiert glaube ich auf den Schwingungen irgendwelcher Quartze.
......
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#12

Re: randomize result ???

  Alt 10. Jan 2003, 20:07
Hi,

@ Sakura : Sagenhaft, wie gesagt Ich kann es immer noch nicht fassen. Diese Zeittaktung kommt doch tatsächlich noch von dem IPM-Ur-PC (1980 ?? oder wann ?). Hierzu sei noch erwähnt, daß in Geldspielautomaten vielfach 486er CPUs stecken, wobei die Taktung eventuell wichtig ist und auch in DB-Fahrkartenautomaten. In den Spielautomaten hängt tatsächlich ein altes 486er - Motherboard senkrecht drin, der Automat war "Made in USA", typisch!

Zitat von czapie:
Diese Funktion wird aus einer anderen mehrmals aufgerufen, aber gibt immer das gleiche result aus .
Ich denke die Zufallsfunktion wird nur einmal ausgeführt und gibt dann immer ihr result zurück, ich brauch es aber unbedingt, dass sie mehrmals ausgeführt wird! Eben für verschiedene Zahlen.
Wer ist in der Lage 18-mal pro Sekunde eine Taste zu drücken ? Schreib das randomize am besten immer direkt dabei und nicht nur einmal im Programm. Das wars dann wohl.

Gruß
Hansa
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.481 Beiträge
 
Delphi 10.1 Berlin Professional
 
#13

Re: randomize result ???

  Alt 10. Jan 2003, 20:17
Zitat von Hansa:
Schreib das randomize am besten immer direkt dabei und nicht nur einmal im Programm. Das wars dann wohl.
Soll das jetzt ironisch gemeint sein? Randomize sollte am besten einmal im OnCreate Ereignis des Hauptformulars aufgerufen werden und dann nicht mehr.
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#14

Re: randomize result ???

  Alt 10. Jan 2003, 20:17
Hallo,

Zitat von Hansa:
[...]Schreib das randomize am besten immer direkt dabei und nicht nur einmal im Programm. Das wars dann wohl[...]

WAAAAAAAHHHH - nein; eben das genau nicht. Es reicht, 'randomize' ein einziges Mal aufzurufen - beispielsweise während des Programmstarts.
Danach musst Du nur noch 'random()' aufrufen, um die gewünschten (Pseudo-)Zufallszahlen zu erhalten.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#15

Re: randomize result ???

  Alt 10. Jan 2003, 20:25
Hi,

Zitat von Daniel:
WAAAAAAAHHHH - nein; eben das genau nicht. Es reicht, 'randomize' ein einziges Mal aufzurufen - beispielsweise während des Programmstarts.
Was solls denn schaden ? Damit Daniel aber nicht unnötig Arbeit hat, die ganzen Threads zu überwachen, klinke ich mich aus diesem aus. Hier ist alles gesagt worden. Der Rest ist wie immer : "selber probieren"

Gruß
Hansa
  Mit Zitat antworten Zitat
czapie

Registriert seit: 17. Nov 2002
Ort: Berlin
384 Beiträge
 
Delphi 5 Standard
 
#16

!!!

  Alt 11. Jan 2003, 12:33
Hi Leute,
erst mal danke für die rege Diskussion und die vielen Antworten, bin grad erst nach hause gekommen, werd noch nen bißchen probieren und dann schreiben wie's war, also wie richtig.

Czapie.
  Mit Zitat antworten Zitat
czapie

Registriert seit: 17. Nov 2002
Ort: Berlin
384 Beiträge
 
Delphi 5 Standard
 
#17

ok habs

  Alt 11. Jan 2003, 12:40
Also,
so funktionierts:
In FormCreate, oder OnCreate, wird das randomize eingetragen,
und in der "Zufallsfunktion" dann immer random aufgerufen, and that works!
Danke, schönes Weeki,
Czapie.
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#18
  Alt 11. Jan 2003, 12:53
Hi Hansa,

ich glaube, du hast noch nicht ganz verstanden, was wir meinen. Angenommen, du schreibst (als einfaches Beispiel) ein Programm, das eine Lottoziehung simuliert. Dann brauchst du schnell 6 bzw. 7 Zufallszahlen hintereinander. Ein Code der so aussähe
Delphi-Quellcode:
var
  numbers: arrray[0..6] of Integer;

procedure GetNumbers();
var
  i: Integer;
begin
  for i := 0 to 6 do begin
    Randomize();
    numbers[i] := Random(7) + 1;
  end;
end;
liefert dir sieben mal die gleiche Zufallszahl, weil nämlich in der Regel auf heutigen Prozessoren so wenig Zeit vergeht, dass ein Achzehntelsekundenschritt nicht auftritt (selbst wenn, dann erhältst du zwei unterschiedliche Zahlen, das ist auch nicht, was du willst).

Folgender Code wäre richtiger:
Delphi-Quellcode:
procedure GetNumbers();
var
  i: Integer;
begin
  Randomize();
  for i := 0 to 6 do
    numbers[i] := Random(49) + 1;
end;
Hier wird Randomize() nur einmal pro Ziehung aufgerufen, das heißt, du bekommst sieben verschiedene Pseudo-Zufallszahlen (die können zwar doppelt vorkommen, aber das Prinzip ist ja wohl klar). Wenn du GetNumbers() nicht oft hintereinander aufrufst, ist das okay.

Der kleine Haken dabei ist nur: Randomize() braucht Rechenzeit - minimal aber trotzdem. Möglicherweise möchtest du aber auch tausend mal hintereinander GetNumbers() aufrufen. Dann musst du das natürlich anders machen:

Delphi-Quellcode:
var
  numbers: array[0..999][0..6] of Integer;

procedure GetNumbers(element: Integer);
var
  i: Integer;
begin
  for i := 0 to 6 do
    numbers[element][i] := Random(49) + 1;
end;

procedure CallGetNumbers();
var
  i: Integer;
begin
  Randomize();
  for i := 0 to 999 do
    GetNumbers(i);
end;
Randomize() wird nur einmal aufgerufen, man bekommt 7000 "ungleiche" Pseudo-Zufallszahlen.

Der Punkt ist, dass die letzte Möglichkeit in jedem Falle die beste ist, da sie am wenigsten rechenzeit braucht (da Randomize() nur einmal aufgerufen wird) und außerdem am wenigsten fehleranflällig ist. Daher ist es sinnvoll, immer diese Möglichkeit zu empfehlen.

Also noch einmal ganz deutlich: Am besten ist es, Randomize() nur einmal im ganzen Programm aufzurufen. Am besten im Project-File (View|Project Source) oder, wenn man nur ein Formular benutzt, im OnCreate-Ereignis.

MfG,
d3g

[edit]Hab ich wohl ein bisschen lange getippt... [/edit]
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#19
  Alt 11. Jan 2003, 14:07
Moin Zusammen,

Zitat von Delphi Hilfe Randomize:
Kombinieren Sie in einer Schleife nicht den Aufruf von Randomize mit Aufrufen der Funktion Random. Normalerweise wird Randomize vor den Aufrufen von Random nur einmal aufgerufen.
und wenn man sich dann mal in der System.pas ansieht, was Randomize macht, hat das durchaus seine Richtigkeit, denn es wird nichts weiter gemacht, als die aktuelle Systemzeit in ihre Entsprechung in Millisekunden umzurechnen und diese dann in der Variablen RandSeed zu speichern.
Die Zahlenfolge die Random ausgibt hängt direkt mit dem Wert in Randseed zusammen, so dass bei einem gleichen Wert für RandSeed die Zahlenfolge von Random auch immer die gleiche ist.
Wer also immer die gleiche "zufällige" Zahlenfolge braucht setzt RandSeed auf immer den gleichen Wert.
Auf Randomize kann man also im Prinzip verzichten, indem man RandSeed selber setzt.

Mehrfaches Aufrufen von Randomize schadet also nur dann, wenn die Zeitdifferenz zwischen den Aufrufen zu klein ist, wie eben, z.b. in einer Schleife.

Übrigens ist die Auflösung des Timers nicht eine 18tel Sekunde (0,0556 sek) sondern 18 Millisekunden (0,018 Sek).
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#20
  Alt 11. Jan 2003, 14:15
Zitat von Christian Seehase:
Übrigens ist die Auflösung des Timers nicht eine 18tel Sekunde (0,0556 sek) sondern 18 Millisekunden (0,018 Sek).
Stimmt natürlich.
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


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 14:26 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