Entwickler-Ecke

Algorithmen, Optimierung und Assembler - Versuch zur Annäherung an Erwartungswert


Dude566 - Mi 02.06.10 18:24
Titel: Versuch zur Annäherung an Erwartungswert
Hallo,

ich habe ein kleines Problem mit der Entwicklung eines eigenen Algorithmus.

Zur Aufgabe:

Spieler A wirft eine Münze solange bis "Wappen" erscheint, er wirft jedoch höchstens 5 mal. Für jeden Wurf muss er 1€ an Spieler B Zahlen.
Ist nach dem 5. Wurf immer noch kein "Wappen" dabei gewesen so muss er zu den 5€ noch 7€ extra zahlen, also insgesamt 12€ wenn kein Wappen erscheinen sollte.

Hierfür haben wir im Unterricht den Erwartungswert errechnet, dieser beträgt 2,156€.
Auf lange Zeit wird also Spieler A 2,16€ an Spieler B pro Spiel zahlen.

Um zu testen ob dies wirklich so ist, wollte ich jetzt ein Programm entwerfen mit dem ich eine lange Versuchsreihe mache, um zu schauen ob sich der Durchschnitt dem Erwartungswert annähert.

Ich habe auch schon etwas Code, komme jedoch leider nicht weiter und meine function liefert mir jedes mal "19" zurück.


Delphi-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:
28:
29:
function TForm1.VersuchAnnaeherung(AValue : Integer) : Single;
var
 spiele : Integer;
 wappen, i : Byte;
begin
  Result := 0;
  wappen := 0;
  i := 0;
  Randomize;
  for spiele := 1 to AValue do
  begin
    while (wappen = 0and (i <= 6do
    begin
      Inc(i);
      wappen := Random(2); // Münze wird geworfen
      if i >= 6 then
      begin
        Result := Result + 7// 5 mal kein Wappen
      end
      else
      begin
        Result := Result + 1;  // A zahl einen Euro an B
      end;
    end;
    i := 0;
    wappen := 0;
  end;
  Result := Result / AValue;
end;


Ich hoffe ihr könnt mir weiterhelfen, denn ich komme einfach nicht weiter.

Mit freundlichen Grüßen,
Dude566


Tryer - Mi 02.06.10 18:50

Warum "<= 6", es sollen doch max 5 Würfe werden

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  Result := 0;
  Randomize;
  for Spiele := 1 to AValue do
  begin
    Wappen := 0;
    i := 0;
    while (i < 5and (Wappen = 0do //i=0..4 -> 5 mal
    begin
      Wappen := Random(2);
      Inc(i);
    end;
    Result := Result + i;
    if Wappen = 0 then
      Result := Result + 7;
  end;
  Result := Result / AValue;

Als Rückgabewert besser Extended nehmen (oder Int64 und sich das Komma denken, also nicht durch AValue teilen)

Grüsse, Dirk


Nersgatt - Mi 02.06.10 18:52

Ohne Deinen Code jetzt im Detail nachvollzogen zu haben (hab ja schon Feierabend), springt mir als erstes ins Auge, dass Deine Function einen Single zurückliefert. Sollte das nicht eher sein? :D


Dude566 - Mi 02.06.10 18:53

Das mit den 6 stimmt, habe ich einfach aus der Aufgabe übernommen, wir hatten 6 Schritte da es beim 5. Wurf ja 2 Möglichkeiten gibt.

Zum Rückgabewert, was soll das ändern? Und durch AValue muss ich doch teilen um den Durchschnittswert zu bekommen.


Tryer - Mi 02.06.10 18:57

Wenn ich das ganze genau 10000000 mal aufrufe dann ist das Ergebnis 21565038 - das der Erwartungswert stimmt sehe ich dann auch ohne die Verfälschung durch das Teilen.

Grüsse, Dirk


Dude566 - Mi 02.06.10 19:01

Also wenn ich es 10.000.000 mal Aufrufe bekomme ich als Rückgabe dieser Funktion 200000000.

Delphi-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:
28:
29:
30:
31:
32:
33:
34:
35:
function TForm1.VersuchAnnaeherung(AValue : Integer) : extended;
var
 spiele : Integer;
 wappen, i : Byte;
begin
  Result := 0;
  wappen := 0;
  i := 0;
  Randomize;
  for spiele := 1 to AValue do
  begin
    while (wappen = 0and (i <= 5do
    begin
      Inc(i);
      wappen := Random(1); // Münze wird geworfen
      if i >= 5 then
      begin
        Result := Result + 1;
        Result := Result + 7// 5 mal kein Wappen
      end
      else
      begin
        Result := Result + 1;  // A zahl einen Euro an B
      end;
    end;
    i := 0;
    wappen := 0;
  end;
  //Result := Result / AValue;
end;

procedure TForm1.btnStartAlgoClick(Sender: TObject);
begin
  edtAnnaeherung.Text := FloatToStr(VersuchAnnaeherung(StrToInt(edtSpiele.Text)));
end;


Tryer - Mi 02.06.10 19:04

Die Lösung steht oben.. übersehen?

Grüsse, Dirk


Dude566 - Mi 02.06.10 19:14

Hey danke, habe ich völlig übersehen. :D
Jetzt ist es auch kürzer und übersichtlicher. ;)