Excel 抛硬币获得特定图案的蒙特卡罗模拟

Excel 抛硬币获得特定图案的蒙特卡罗模拟,excel,vba,montecarlo,probability-theory,Excel,Vba,Montecarlo,Probability Theory,受本文启发,我使用Excel VBA进行了蒙特卡罗模拟,以确定抛硬币以获得特定图案的预期次数。下面的代码是蒙特卡罗模拟,用于投掷一枚公平的硬币,以获得图案HTH,其中H为头部(1),T为尾部(0) Sub-Tossing_-Coin() 暗抛(1000000)为双精度,NToss(1000000)为双精度,AVToss(1000000)为双精度 t0=计时器 表2.1.1.2清除 a=0 对于j=1到1000000 p1=Rnd() 如果p1,则需要一个字符串来存储要查找的模式 然后在每次投掷之

受本文启发,我使用Excel VBA进行了蒙特卡罗模拟,以确定抛硬币以获得特定图案的预期次数。下面的代码是蒙特卡罗模拟,用于投掷一枚公平的硬币,以获得图案HTH,其中H为头部(1),T为尾部(0)

Sub-Tossing_-Coin()
暗抛(1000000)为双精度,NToss(1000000)为双精度,AVToss(1000000)为双精度
t0=计时器
表2.1.1.2清除
a=0
对于j=1到1000000
p1=Rnd()

如果p1,则需要一个字符串来存储要查找的模式

然后在每次投掷之后,将最新的结果附加到结果字符串的末尾

然后检查结果字符串的最后n位是否=模式,其中n=模式的长度

如果匹配,则记录掷骰次数和空白结果字符串,然后再次进行


您可能需要大约20行代码才能完成!希望这能有所帮助。

为了提高效率,您可以使用变量的位,通过掷骰分配位。然后,对于每次抛投,旋转左侧的位并将抛投结果添加到第一个位置,直到右侧的位与模式匹配:

pattern "HTH"  : 101
mask for "XXX" : 111

1 toss "H" :       1 And 111 = 001
2 toss "T" :      10 And 111 = 010
3 toss "T" :     100 And 111 = 100
4 toss "H" :    1001 And 111 = 001
5 toss "H" :   10011 And 111 = 011
6 toss "T" :  100110 And 111 = 110
7 toss "H" : 1001101 And 111 = 101  : "HTH" matches the first 3 bits
请注意,VBA没有位移位运算符,但向左移位1位与乘以2相同:

  decimal  9 =   1001 in bits
 9 +  9 = 18 =  10010 in bits
18 + 18 = 36 = 100100 in bits
下面是一个获得与序列匹配的平均投掷次数的示例:

Sub-UsageExample()
Const sequence=“HTH”
常量样本=100000
MsgBox“平均值:&GetTossingAverage(序列、样本)
端接头
函数GetToSingAverage(序列为字符串,样本长度为)为Double
暗淡的期待&,投掷&,面具&,扫视#,我&
随机化“初始化随机生成器”
'将第[TH]个序列转换为位序列。例如:HTH->00000101'
对于i=1到Len(顺序)
期望值=期望值+期望值-(中间$(序列,i,1)=“T”)
下一个
'生成位旋转的掩码。Ex:HTH->01101111'
掩码=(2^(Len(序列)*2+1))-(2^ Len(序列))-1
“迭代样本”
对于i=1的样品
投掷=面具
'生成一个新的掷骰子,直到我们得到预期的序列'
做
TOSSHONT=TOSSHONT+1
'旋转左侧的位并在位置1处排列新位'
投掷=(投掷+投掷-(Rnd<0.5))和面具
循环直到抛出=预期
下一个
GetTossingAverage=搜索/样本
端函数

如果您能提供您声称的20行代码,我将不胜感激。谢谢你的回答,但是你能在每一行上给我额外的评论吗,因为我在一些部分没有得到它,比如:
expected=expected+expected-(Mid$(sequence,I,1)=“t”)
mask=(2^(Len(sequence)*2+1))-(2^ Len sequence))-1
,等等,如果我改变得到头部的概率,例如:p=0.3,你如何确保答案仍然正确?是否有数学证明支持您的模拟?
  decimal  9 =   1001 in bits
 9 +  9 = 18 =  10010 in bits
18 + 18 = 36 = 100100 in bits