Inspiriert von diesem Artikel: Statistics of Coin-Toss Patterns, habe ich eine Monte-Carlo-Simulation durchgeführt, um die erwartete Anzahl von Münzen zu erhalten, um ein bestimmtes Muster mit Excel VBA zu erhalten. Der folgende Code ist die Monte-Carlo-Simulation zum Werfen einer fairen Münze, um Muster HTH zu erhalten, wobei H Kopf (1) und T Schwanz (0) ist.Monte-Carlo-Simulation zum Werfen einer Münze, um ein bestimmtes Muster zu erhalten
, die mit dem Ergebnis übereinstimmt, wie in dem Artikel gezeigt:
Sub Tossing_Coin()
Dim Toss(1000000) As Double, NToss(1000000) As Double, AVToss(1000000) As Double
t0 = Timer
Sheet2.Cells.Clear
a = 0
For j = 1 To 1000000
p1 = Rnd()
If p1 <= 0.5 Then
Toss(1) = 1
Else
Toss(1) = 0
End If
p2 = Rnd()
If p2 <= 0.5 Then
Toss(2) = 1
Else
Toss(2) = 0
End If
i = 2
Do
p3 = Rnd()
If p3 <= 0.5 Then
Toss(i + 1) = 1
Else
Toss(i + 1) = 0
End If
i = i + 1
Loop Until Toss(i - 2) = 1 And Toss(i - 1) = 0 And Toss(i) = 1
NToss(j) = i
a = a + NToss(j)
AVToss(j) = a/j
b = AVToss(j)
Next j
MsgBox "The expected number of tossing is " & b & "." _
& vbNewLine & "The running time of simulation is " & Round(Timer - t0, 2) & " s."
End Sub
Die Ausgabe des Programms wird, wie unten gezeigt. Andere Muster zum Werfen einer fairen Münze sind ebenfalls passend. Trotz der Ergebnisse bin ich immer noch unsicher, ob das Programm, das ich geschrieben habe, korrekt ist oder nicht. Meine Zweifel entstehen, wenn die Münze unfair ist, dh p1
, p2
und p3
sind nicht gleich 0,5, da ich keine Informationen habe, um ihre Genauigkeit zu überprüfen. Ich möchte auch wissen, wie man ein effizientes Programm in VBA Excel oder R schreibt, um die obige Simulation für ein längeres Muster wie THTHTHTHTH, THTTHHTHTTH usw. auszuführen, und seine Schleifen sind mehr als 1.000.000 (vielleicht 100.000.000 oder 1.000.000.000), aber immer noch ziemlich schnell? Irgendeine Idee?
Vielen Dank für Ihre Antwort, aber können Sie zusätzliche Kommentare zu jeder Zeile geben, da ich es nicht auf einigen Teilen wie: 'erwartet = erwartet + erwartet - (Mid $ (sequence, i, 1) =" T ") ',' mask = (2^(Len (Folge) * 2 + 1)) - (2^Len (Folge)) - 1' usw. Wie auch immer, wie kannst du sicherstellen, dass die Antwort immer noch korrekt ist, wenn ich die Wahrscheinlichkeit ändere Kopf bekommen, zum Beispiel: p = 0,3? Gibt es einen mathematischen Beweis, um Ihre Simulation zu unterstützen? –