受这篇文章的启发:掷硬币模式统计,我进行了蒙特卡罗模拟,以确定使用 Excel VBA 获得特定模式的预期掷硬币次数。下面的代码是蒙特卡罗模拟,用于掷硬币以获得模式 HTH,其中 H 是正面 (1),T 是尾部 (0)。
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
程序的输出如下图所示:
这与文章中显示的结果一致。投掷公平硬币的其他模式也是匹配的。尽管有结果,但我仍然不确定我编写的程序是否正确。当硬币不公平时,我会产生疑问,即p1
,p2
和p3
不等于 0.5,因为我没有任何信息来检查其准确性。我还想知道如何在 VBA Excel 或 R 中编写一个高效的程序来执行上面的模拟,以实现更长的模式,如 THTHTHTHT、THTTHHTHTTH 等,它的循环超过 1,000,000(可能是 100,000,000 或 1,000,000,000)但仍然相当快?任何想法?