Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Lottozahlen (https://www.delphipraxis.net/61985-lottozahlen.html)

bonanza 29. Jan 2006 11:32


Lottozahlen
 
Hi,
ich will ein programm schrieben, dass 10.000 mal lottozahlen generiert. dann möchte ich wissen, wie oft jede zahl gezogen wurde.


Hier mein bisheriges Programm. Aber irgendwie spuckt der da komische zahlen bei der häufigkeit aus.
Auch wäre es super, wenn jemand weiß, wie ich auch auf das 1. Item der listbox zugreifen kann.
Wäre euch sehr dankbar, wenn jemand mal gucken könnte, wo da der fehler ist.

danke schonmal im voraus
bonanza

Code:
var
  Form1: TForm1;
  lottozahlen: Array[1..49] of Boolean;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,j,k, zz: integer;
begin
randomize;
ListBox1.Items.Clear;
for i := 1 to 49 do ListBox1.Items.Add(inttostr(0));

for k:= 1 to 10000 do begin
              for i := 1 to 49 do lottozahlen[i]:= false;
              for i := 1 to 6 do begin
                        j:=0;
                        repeat
                        zz:= random(48)+1;
                        IF (lottozahlen[zz]=false) then begin
                                            lottozahlen[zz]:= true;
                                            ListBox1.Items[zz]:= inttostr(strtoint(ListBox1.Items[zz])+1);
                                            j := 1;
                                            end;
                        until (j=1);

              end; // von (i=>6)

   end; // von (k=>10000)
end;

end.

leddl 29. Jan 2006 11:55

Re: Lottozahlen
 
Zitat:

Zitat von bonanza
Hi,
Hier mein bisheriges Programm. Aber irgendwie spuckt der da komische zahlen bei der häufigkeit aus.

Und was für komische Zahlen?
Zitat:

Zitat von bonanza
Auch wäre es super, wenn jemand weiß, wie ich auch auf das 1. Item der listbox zugreifen kann.

Wo ist das Problem? Du greifst in deinem Code doch auf ein Item der ListBox zu (ListBox1.Items[zz]). Das ist das (zz+1)'te Element, da die Items der ListBox 0-basiert sind. Das erste Element hat daher den Index 0.
Zitat:

Zitat von bonanza
Wäre euch sehr dankbar, wenn jemand mal gucken könnte, wo da der fehler ist.

Der Fehler ist genau das, was ich ein Quote weiter oben geschrieben habe. Die Items sind 0-basiert, dein Array 1-basiert. Du beschreibst also in der ListBox den falschen Index. (Siehe Zeile 34ff)
Delphi-Quellcode:
var
  Form1: TForm1;
  lottozahlen: Array[1..49] of Boolean;
implementation

{$R *.dfm}

procedure TForm1.OnCreate(Sender: TObject);
Begin
  randomize; //Randomize nur einmal im Programm aufrufen !!!
End;

procedure TForm1.Button1Click(Sender: TObject);
var i, k, zz: Integer;
    gesetzt : Boolean;
begin
  ListBox1.Items.Clear;
  for i := 1 to 49 do
    ListBox1.Items.Add('0'); //Warum hier erst IntToStr aufrufen?
                             //Geht doch auch direkt
  for k := 1 to 10000 do
  begin
    for i := 1 to 49 do
      lottozahlen[i] := false;
    for i := 1 to 6 do
    begin
      //Ist meiner Meinung nach sinnvoller mit nem Boolean
      gesetzt := false;
      repeat
        zz:= random(48)+1;
        if (not lottozahlen[zz]) then
        begin
          lottozahlen[zz] := true;
          //ListBox1.Items ist 0-basiert, dein Array 1-basiert, daher mußt
          //du den Index anpassen
          ListBox1.Items[zz-1]:= inttostr(strtoint(ListBox1.Items[zz-1])+1);
          gesetzt := true;
        end;
      until gesetzt
    end; // von (i=>6)
   end; // von (k=>10000)
end;

end.
Ich konnte jetzt aber sonst auf die Schnelle und ohne es zu testen keinen Fehler feststellen. Vielleicht is mir aber auch einfach was durchgerutscht. Schreib doch einfach mal - falls das hier nichts geholfen hat - was genau so seltsam an der Verteilung ist.

//Edit:
Code- in Delphi-Tags gesetzt, wozu ham wir die denn? :mrgreen:

bonanza 29. Jan 2006 12:07

Re: Lottozahlen
 
[quote="leddl"]
Zitat:

Zitat von bonanza
Hi,
Hier mein bisheriges Programm. Aber irgendwie spuckt der da komische zahlen bei der häufigkeit aus.

Und was für komische Zahlen?

0
1228
1258
1246
1246
usw insgesamt ja 49 aber alle über 1200
und das kann ja bei 10.000 versuchen nicht hinkommen.


Zitat:

Zitat von bonanza
Auch wäre es super, wenn jemand weiß, wie ich auch auf das 1. Item der listbox zugreifen kann.

Wo ist das Problem? Du greifst in deinem Code doch auf ein Item der ListBox zu (ListBox1.Items[zz]). Das ist das (zz+1)'te Element, da die Items der ListBox 0-basiert sind. Das erste Element hat daher den Index 0.

ja und wie verbessere ich dann mein programm, sodass das auch funktioniert?

leddl 29. Jan 2006 12:18

Re: Lottozahlen
 
[quote="bonanza"]
Zitat:

Zitat von leddl
Zitat:

Zitat von bonanza
Hi,
Hier mein bisheriges Programm. Aber irgendwie spuckt der da komische zahlen bei der häufigkeit aus.

Und was für komische Zahlen?

0
1228
1258
1246
1246
usw insgesamt ja 49 aber alle über 1200
und das kann ja bei 10.000 versuchen nicht hinkommen.

:gruebel: Warum? Passt doch... Die Null am Anfang kommt von dem Index-Problem, das ich dir erklärt habe. Und wenn du mal rechnest: 49*1200 = 58800 ~ 60000 => passt!
Zitat:

Zitat von bonanza
ja und wie verbessere ich dann mein programm, sodass das auch funktioniert?

Wie gesagt, es funktioniert. Scroll meinen Post etwas weiter runter, da steht dann auch ein überarbeiteter Code. Das waren aber auch nur Kleinigkeiten, im Prinzip wars ja (fast) korrekt.

bonanza 29. Jan 2006 13:37

Re: Lottozahlen
 
aber jetzt wird ja nie etwas in das item 49 geschrieben, denn wir berechnen ja nur zufallszahlen von 1-49 und wnen wir dann immer -1 rechnen bringt das ja nicht wirklich was oder?

leddl 29. Jan 2006 13:48

Re: Lottozahlen
 
Hast dus mal getestet? :roll: Zähl mal die Anzahl der Elemente und vergleiche: 0,1,...,48 <=> 1,2,...,49 :zwinker:

bonanza 29. Jan 2006 13:51

Re: Lottozahlen
 
hmm wenn ich alle items dann addiere (also vorher -1000 rechne) kommt da 12.000 raus :-\

leddl 29. Jan 2006 14:00

Re: Lottozahlen
 
Du hast 49 Zahlen, die alle etwa 1.200 mal gezogen werden. => 49 * 1200 ~ 60.000
Es wird 10.000 mal gezogen, wobei bei jeder Ziehung 6 Zahlen gezogen werden => 10.000 * 6 = 60.000

Wie du jetzt auf deine 12.000 kommst, weiß ich nich. Warum überhaupt minus 1000? :gruebel:

Garfield 29. Jan 2006 15:29

Re: Lottozahlen
 
Zitat:

Zitat von leddl
Wie du jetzt auf deine 12.000 kommst, weiß ich nich. Warum überhaupt minus 1000? :gruebel:

Passt doch.

Random(48 ) ergibt Real im Bereich von 0 <= X < 48. Der ganzahlige Anteil liegt dann bei 0 bis 47. Bei der Addition mit 1 ergibt sich ein Zahlenbereich von 1 bis 48. Die 49 kommt nicht vor.

Folge dessen ist, dass die erste Summe 0 ist und sich trotz unterschiedlicher Terminierung im ersten Source keine Exception ergibt, weil das nicht existierende ListBox1.Items[49] gar nicht angesprochen wird.

So ergibt sich 48 Zahlen mal 1000 gleich 48000, addiert mit den 12000 sind es 60000.

Nachtrag:

Zitat:

Zitat von leddl
Warum überhaupt minus 1000? :gruebel:

Vermutlich, weil jede Zahl mindestens 1000 vorhanden ist. Ist im realen Lotto aber absolut unlogisch.

bonanza 30. Jan 2006 20:49

Re: Lottozahlen
 
ok danke erstmal für eure hilfe, aber ich brauche ja 49 zahlen ... was muss ich denn umändern, damit herausbekomme, wieoft jede der 49 zahlen gezogen wurde ?

mfg
bonanza

leddl 30. Jan 2006 21:02

Re: Lottozahlen
 
Zitat:

Zitat von Garfield
Random(48 ) ergibt Real im Bereich von 0 <= X < 48.

:wall: Stimmt, das vergess ich immer wieder :lol:

Zitat:

Zitat von bonanza
ok danke erstmal für eure hilfe, aber ich brauche ja 49 zahlen ... was muss ich denn umändern, damit herausbekomme, wieoft jede der 49 zahlen gezogen wurde ?

Na was wirst du wohl ändern müssen, damit du anstatt 48 49 Zahlen bekommst? :roll: Lies dir Garfields Post nochmal durch, dann sollte dir das entgegenspringen. ;) Dann noch den Fehler ausbessern, den ich dir gezeigt hab, dann sollte es funktionieren.

//Edit:
Zitat:

Zitat von Garfield
So ergibt sich 48 Zahlen mal 1000 gleich 48000, addiert mit den 12000 sind es 60000.

Entweder steh ich wirklich total auf dem Schlauch, oder das macht überhaupt keinen Sinn... Warum denn mal 1000? Rein statistisch müßte jede Zahl 1224,5 vorkommen, also warum 1000?

Garfield 31. Jan 2006 07:05

Re: Lottozahlen
 
Zitat:

Zitat von leddl
Zitat:

Zitat von Garfield
So ergibt sich 48 Zahlen mal 1000 gleich 48000, addiert mit den 12000 sind es 60000.

Entweder steh ich wirklich total auf dem Schlauch, oder das macht überhaupt keinen Sinn... Warum denn mal 1000? Rein statistisch müßte jede Zahl 1224,5 vorkommen, also warum 1000?

Zitat:

Zitat von bonanza
hmm wenn ich alle items dann addiere (also vorher -1000 rechne) kommt da 12.000 raus :-\

Item[0] ist 0, Item[1] bis [48] sind größer als 1000. Deshalb hat bonanza 48 mal 1000 abgezogen und als Ergebnis 12000 erhalten.

Zitat:

Zitat von bonanza
... was muss ich denn umändern, damit herausbekomme, wieoft jede der 49 zahlen gezogen wurde ?

Wenn Du entsprechend leddl's Aufforderung meinen letzten Post nochmal durchliest, sollte Dir auffallen, dass Du nicht 49 sondern nur 48 Zahlen verwendest.

leddl 31. Jan 2006 07:13

Re: Lottozahlen
 
Zitat:

Zitat von Garfield
Item[0] ist 0, Item[1] bis [48] sind größer als 1000. Deshalb hat bonanza 48 mal 1000 abgezogen und als Ergebnis 12000 erhalten.

:stupid: Ja, daß er das gemacht hat, ist mir schon klar, die Frage war WARUM? Ich könnte ja genausogut sagen "Jedes Item ist größer als 649, also ziehe ich 649 ab..." :lol: Warum gerade 1000? Warum überhaupt etwas abziehen?

Garfield 31. Jan 2006 08:15

Re: Lottozahlen
 
Dann war Deine Frage bei mir falsch angekommen. Eine Antwort kann Dir wahrscheinlich auch nur bonanza selbst geben, denn mir verschließt sich im Moment auch der Sinn dieser Operation.


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