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 = 0) and (i <= 6) do begin Inc(i); wappen := Random(2); if i >= 6 then begin Result := Result + 7; end else begin Result := Result + 1; 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 < 5) and (Wappen = 0) do 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 = 0) and (i <= 5) do begin Inc(i); wappen := Random(1); if i >= 5 then begin Result := Result + 1; Result := Result + 7; end else begin Result := Result + 1; end; end; i := 0; wappen := 0; end; 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. ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!