Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi random <> zufall (würfeln) (https://www.delphipraxis.net/30872-random-zufall-wuerfeln.html)

Fluffy 30. Sep 2004 14:44


random <> zufall (würfeln)
 
hi!

ich muss eine bestimmte anzahl würfel werfen und die augen zusammenzählen. danach nochmal eine andere anzahl würfel und nochmals zusammenzählen.
und zum schluss diese beiden zahlen zusammenrechnen - hier mein code bis jetzt:
Delphi-Quellcode:
procedure TForm1.FormActivate(Sender: TObject);
var
  i,z,v:Integer;
begin
  z:=0;
  v:=0;
  for i:=1 to max1 do begin
    z:=z+random(6)+1;
  end;
  for i:=1 to max2 do begin
    v:=v+random(6)+1;
  end;
  label1.Caption:=IntToStr(z+v);
end;
nur ist jetzt das problem, dass z und v genau dasselbe ergeben, wenn max1 und max2 identisch sind - soll heissen, random gibt mir keine zufällige zahl, auch nicht durch randomize, weil ja alles zur selben zeit passiert. es muss aber zufällig werden!
eigentlich will ich nicht unbedingt, dass ich zwei buttons klicken muss oder so was umständliches, aber wenn ihr nicht weiterwisst bleibt mir nichts anderes übrig :roll:

greetz
fluffy

Dax 30. Sep 2004 14:46

Re: random <> zufall (würfeln)
 
Herzlich willkommen in der DP! :party:

Nutze doch nochmal Randomize() zwischen den Schleifen, vielleicht hilft das.

Meflin 30. Sep 2004 14:47

Re: random <> zufall (würfeln)
 
öhm eigentlich sollte durch randomize doch zwei zufallszahlen rauskommen, es geschieht ja eh nicht genau zur gleichen zeit, das ist unmöglich!

Fluffy 30. Sep 2004 14:55

Re: random <> zufall (würfeln)
 
wie ich bereits sagte, randomize funktioniert nicht, das hab ich schon versucht... vl ist es zu schnell als dass randomize einen anderen wert liefern könnte, keine ahnung - es geht einfach nicht :mrgreen:

Dax 30. Sep 2004 14:56

Re: random <> zufall (würfeln)
 
Dann setzte RandSeed zwischen den Schleifen eben selbst.

static_cast 30. Sep 2004 14:58

Re: random <> zufall (würfeln)
 
Hi,

pack mal in dein Create oder so

Delphi-Quellcode:
..
Randomize;
..

Zitat:

procedure Randomize;

Beschreibung

Randomize initialisiert den integrierten Zufallszahlengenerator mit einem zufälligen Wert (der aus der Systemzeit abgeleitet wird). Der Zufallszahlengenerator sollte initialisiert werden, indem die Prozedur Randomize aufgerufen oder der Variablen RandSeed ein Wert zugewiesen wird.

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.
Grüße
Daniel

Treffnix 30. Sep 2004 15:01

Re: random <> zufall (würfeln)
 
wo genau haste denn randomize aufgerufen? Prinzipiell darf man Randomize nur einmal aufrufen und zwar, bevor man das erste mal random benutzt. Ausserdem solltest du dir dein random nochmal angucken. Wenn ich mich nicht irre, gibt dir random( 6 ) + 1 eine Zahl zwischen 1 und 7 zurück. Ich denke mal du willst aber 1-6...

Fluffy 30. Sep 2004 15:03

Re: random <> zufall (würfeln)
 
@static: s. vorheriger post

@dax: :wall: das einfachste sieht man immer erst am schluss... ja, so gehts! vielen dank!

xineohp 30. Sep 2004 15:03

Re: random <> zufall (würfeln)
 
moim,

:gruebel: also bei mir funz folgender Code perfekt ... ob mit oder ohne randomize.
bei identischem max1 und max2 sind v und z halt recht dicht beieinander, aber nur selten gleich.
Delphi-Quellcode:
var
  i,z,v:Integer;
begin
  z:=0;
  v:=0;
  randomize;
  for i:=1 to 100 do begin
    z:=z+random(6)+1;
  end;
  randomize;
  for i:=1 to 100 do begin
    v:=v+random(6)+1;
  end;
  label1.Caption:=IntToStr(z+v);
  label2.Caption:=IntToStr(z);
  label3.Caption:=IntToStr(v);
end;

Wheelie 30. Sep 2004 15:04

Re: random <> zufall (würfeln)
 
Dann machst du irgendwas falsch. Habe deine Prozedur mal ausprobiert und Randomize im OnFormCreate-Ereignis ergänzt -> funktioniert tadellos. Du hast Randomize wahrscheinlich mit in die Schleife genommen, was zu nichtzufälligen Ergebnissen führen dürfte.

alcaeus 30. Sep 2004 15:04

Re: random <> zufall (würfeln)
 
Zitat:

Zitat von Treffnix
Wenn ich mich nicht irre, gibt dir random( 6 ) + 1 eine Zahl zwischen 1 und 7 zurück. Ich denke mal du willst aber 1-6...

Du irrst dich aber :mrgreen:
Random(6) gibt eine Zahl zwischen 0 und 5 zurück, nicht 0 und 6.

Greetz
alcaeus

Fluffy 30. Sep 2004 15:08

Re: random <> zufall (würfeln)
 
also, 1. ihr seid viel zu schnell mit antworten :-D
2. wie gesagt, das einfachste sieht man am schluss - wheelie hat recht! :wall: :mrgreen:

Treffnix 30. Sep 2004 15:09

Re: random <> zufall (würfeln)
 
Zitat:

Zitat von xineohp
moim,

:gruebel: also bei mir funz folgender Code perfekt ... ob mit oder ohne randomize.
bei identischem max1 und max2 sind v und z halt recht dicht beieinander, aber nur selten gleich.
Delphi-Quellcode:
var
  i,z,v:Integer;
begin
  z:=0;
  v:=0;
  randomize;
  for i:=1 to 100 do begin
    z:=z+random(6)+1;
  end;
  randomize;
  for i:=1 to 100 do begin
    v:=v+random(6)+1;
  end;
  label1.Caption:=IntToStr(z+v);
  label2.Caption:=IntToStr(z);
  label3.Caption:=IntToStr(v);
end;

Und nochmal: Randomize ruft man nur einmal auf.

@alcaeus: :oops: Stimmt. Habs auch gerade nochmal nachgeschaut. Zählt als Ausrede, dass ichs schon ewig nicht mehr benutzt habe? :stupid:

static_cast 30. Sep 2004 15:12

Re: random <> zufall (würfeln)
 
Zitat:

Zitat von Wheelie
Dann machst du irgendwas falsch. Habe deine Prozedur mal ausprobiert und Randomize im OnFormCreate-Ereignis ergänzt -> funktioniert tadellos. Du hast Randomize wahrscheinlich mit in die Schleife genommen, was zu nichtzufälligen Ergebnissen führen dürfte.

Jo genau wie ich in meinem Post schrieb, so hab ich es auch getestet und funzt.

xineohp 30. Sep 2004 15:21

Re: random <> zufall (würfeln)
 
@Treffnix: IMHO dient Randomize zur Inizialisierung einer Reihe von Zufallszahlen. Wenn man also z und v als je eine Reihe auffasst, so ist der zweimalige Gebrauch von randomize meiner Meinung nach durchaus gerechtfertigt. Man darf randomize nur nicht vor jedem random aufrufen.

nailor 30. Sep 2004 16:32

Re: random <> zufall (würfeln)
 
xineohp: der erste teil ist zwar von der logik her richtig, aber dennoch sollte randomize nur einmal aufgerufen werden. und einmal aufrufen ist beim laden des programms einfach am besten. danach hat randomize eigentlich nichts mehr verloren, da der nutzen gegen null geht und der mögliche schaden hoch ist.


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