Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - 1000-maliger Würfelwrf, der simuliert wird


sharky1000us - Mi 04.12.02 20:34
Titel: 1000-maliger Würfelwrf, der simuliert wird
habe eine frage.
Die aufgabe lautet:

Schreibe einen Programmteil, mit dem ein 1000-maliger Würfelwurf simuliert wird.
Dabei soll gezählt werden, wie oft die "1" dreimal hintereinandr auftrat.


Delete - Mi 04.12.02 20:40

Schön.

Und wo ist die jetzt die Frage, die du so großspurig angekündigt hast? :roll:

P.S.: Klingt ziemlich nach einer Schulaufgabe. Und die mußt du schon selber machen. Bei konkreten Fragen wird gerne geholfen. Aber bei "Kann mir mal einer ... machen." Sehe ich rot. :evil:


sharky1000us - Mi 04.12.02 20:53

alos nur zur info, ich frage hier, weil ich´s nicht kapier und nicht weil ich kein bock habe das zumachen. ;-) ich habe alle 8 aufgaben selber gemacht auf dem blatt nur kapier ich einfach nicht wie diese hier gehen soll. Dazu nur das ;-)
deshalb poste ich hier rein in der hoffnung, das mir irgendjemand erklärt wie das geht


Delete - Mi 04.12.02 21:05

Imnmer noch schön. Und wann stellst du nun endlich deine Frage oder erklärst uns wie wir dir helfen können?
"Ich kapier es nicht." ist etwas schammig. Du kapierts was nicht? Wie man Zufallszahlen erzeugt. Wie man zwei Zahlen vergleicht. Wie man einen Zähler baut.
So wie du bisher fragst (bzw. nicht fragst) läuft das immer noch daraufhinaus, dass man dir das Programm schreiben soll.


sharky1000us - Mi 04.12.02 21:14

och mensch, ich will wissen wie ich das mache, dass ich die zahlen 3 mal hintereinander vergleiche, das ist das einzigste problem, und nun ist di frage wie ich die 3 Zahlen hintereinander vergleiche?!


Anonymous - Mi 04.12.02 21:26

Hab sie aus Langerweile gemacht. Allerdings werden hier 1, 1, 1, 1 als zwei dreier Eins'en angesehen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
procedure TForm1.Button1Click(Sender: TObject);
var
  w, k: Word;
begin
  Randomize;
  with ListBox1 do begin
    Clear;

    for w := 0 to 999 do Items.Add(IntToStr(Random(6) + 1));

    k := 0;
    for w := 0 to Items.Count - 3 do begin
      if Items[w] = '1' then
        if Items[w + 1] = '1' then
          if Items[w + 2] = '1' then //Inc(k);
          begin //Etwas Show
            Inc(k);
            TopIndex := w;
            Sleep(1000);
            Application.ProcessMessages;
          end;
    end;
  end;
  ShowMessage(IntToStr( k ));
end;


Umsetzen muß du es aber selber.


Christian S. - Mi 04.12.02 21:32


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
procedure TForm1.Button1Click(Sender: TObject);
VAR werte : ARRAY[0..1] OF Integer;
    aktuell, i, anzahl, gesucht : Integer;
    tripel : Boolean;
begin
  tripel := True;
  gesucht:=1;
  anzahl:=0;
  aktuell:=0;
  werte[0]:=0;
  werte[1]:=0;
  for i:=1 TO 1000 DO
  begin
    aktuell:=random(6)+1; //würfeln
    if (not tripel) and (aktuell=gesucht) and (werte[0]=gesucht) and (werte[1]=gesucht) then
    //  es gab nicht schon ein Tripel (wäre also die vierte Zahl in Folge)
    // +die vorigen zwei und die aktuelle Zahl sind gleich der Gesuchten
      begin
        inc(anzahl);
        tripel:=true; //merken, dass es jetzt ein Tripel gab
      end;
    if (tripel) and (aktuell<>gesucht) then tripel:=false;
    werte[0]:=werte[1]; //Das Gedächtnis aktualsieren
    werte[1]:=aktuell;
  end;
  Label1.Caption:=IntToStr(anzahl);
end;


Hi! Es treten keine Programmfehler auf, aber ich weiß nicht, ob es wirklich funktioniert. Das müsstest Du noch einmal ausprobieren. Folgendes noch zu sagen: "gesucht" enthält die Zahl, die drei mal vorkommen soll. Das Array "Werte" enthält die letzten beiden Zahlen. Der Rest ist erklärt oder logisch.

Hoffe, ich habe Dir geholfen,
Peter


Christian S. - Mi 04.12.02 21:34

Da war ja einer schneller!


smiegel - Fr 13.12.02 18:22

Oder so:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function CountEinser:Integer;
var i, eins:Integer;
begin
  Randomize;
  eins:=0; Result:=0;
  for i:=0 to 999 do
  begin
    if (Random(6)+1 = 1) then Inc(eins);
    if (eins=3) then
    begin
      eins:=0;
      Inc(Result);
    end;
  end; // for i
end; // CountEinser


Wolff68 - Fr 13.12.02 18:35

@smiegel: Du kannst statt dessen auch einfach die Anzahl einsen am Ende durch 3 Teilen. Deinem Alghi isses nämlich egal, ob die einsen hintereinander stehen...

Wenn, dann solltest Du eins bei jeder anderen Zahl auch auf 0 setzen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function CountEinser:Integer; 
var i, eins:Integer; 
begin 
  Randomize; 
  eins:=0; Result:=0; 
  for i:=0 to 999 do 
  begin 
    if (Random(6)+1 = 1) then Inc(eins)
      else eins:=0; //Diese Zeile hattest vergessen
    if (eins=3) then 
    begin 
      eins:=0; 
      Inc(Result); 
    end; 
  end; // for i 
end; // CountEinser
Ansonsten: Hübsch, klein, effektiv.


smiegel - Sa 14.12.02 23:39

@Wolff68: Du hast recht. Hab den Algo on the fly hingeschrieben und dann kann das schon mal vorkommen.

Um das ganze auf die Spitze zu trieben, noch eine kleine Änderung, damit kann man dann jede Ziffer auf x-beliebige-Wiederholungen prüfen:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
function CountFolgen(Auge, wieOft, Wuerfe:Integer):Integer; 
var i, treffer:Integer; 
begin 
  Randomize; 
  treffer:=0; Result:=0; 
  for i:=0 to Wuerfe-1 do 
  begin 
    if (Random(6)+1 = Auge) then Inc(treffer); 
    if (treffer=wieOft) then 
    begin 
      treffer:=0; 
      Inc(Result); 
    end; 
  end; // for i 
end; // CountFolgen


Aufgerufen wird sie dann folgendermaßen:

Quelltext
1:
2:
3:
4:
5:
6:
7:
  ...  
  // in Anlehnung an obiges Problem
  Loesung:=CountFolgen(1, 3, 1000);
  ...
  // wie oft kommen 5 Sechsen hintereinander in 10.000 Würfern vor
  Loesung:=CountFolgen(6, 5, 10000);
  ...


Wolff68 - So 15.12.02 15:22

Ääähmmm, smiegel: Fehlt da nicht 'ne gewisse Zeile? :wink: :twisted:


smiegel - So 15.12.02 22:18

Hallo Wolff68, Du hast schon wieder recht. Asche auf mein Haupt :(

So, das letzte Mal, aber (hoffentlich) ohne Fehler:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function CountFolgen(Auge, wieOft, Wuerfe:Integer):Integer; 
var i, treffer:Integer; 
begin 
  Randomize; 
  treffer:=0; Result:=0; 
  for i:=0 to Wuerfe-1 do 
  begin 
    if (Random(6)+1 = Auge) then Inc(treffer)
     else treffer:=0;
    if (treffer=wieOft) then
    begin 
      treffer:=0; 
      Inc(Result); 
    end; 
  end; // for i 
end; // CountFolgen