我构建的蒙特卡罗模拟遇到了一个奇怪的问题。它是一个嵌套循环,用于计算投资的预期价值(实际上是扑克锦标赛)。为了进行演示,假设我们正在讨论单挑扑克锦标赛,这相当于抛硬币。假设每次抛硬币的投资回报率为 25%,买入金额为 1,那么抛硬币 100 次(500, 1000)次后的 EV 为 25 (125, 250) 个单位。然而,模拟分别返回 24,6、123,6 和 246。
代码中的关键行在这里:
Randomize
randomnumber = Rnd()
If randomnumber > adjustedITM Then
MC_array(m, n) = -tournamentvariables(k, 6)
Else:
Randomize
MC_array(m, n) = CDec(tournamentstructures(Int(Rnd() * (tournamentvariables(k, 7)) + 1), k) * tournamentvariables(k, 6) * (1 - tournamentvariables(k, 5)) * tournamentvariables(k, 2) - tournamentvariables(k, 6))
End If
第二个 MC_array(m, n) 是关键代码行。如果玩家获胜,它会给出净利润。如果是抛硬币,则为一个单位。如果我将第二行更改为
Randomize
If Rnd() > adjustedITM Then
MC_array(m, n) = -tournamentvariables(k, 6)
Else:
Randomize
MC_array(m, n) = 1
End If
结果是正确的。第二个 MCarray 之后的代码将硬币翻转简化为:
CDec(tournamentstructures(Int(Rnd() * (tournamentvariables(k, 7)) + 1), k) * tournamentvariables(k, 6) * (1 - tournamentvariables(k, 5)) * tournamentvariables(k, 2) - tournamentvariables(k, 6))
=
CDec(tournamentstructures(1,1) * 1 * (1 - 0%) * 2 - 1)
所以和一模一样。数组锦标赛结构()的大小为(1,1),因此它无法读取任何内容。我验证了所有结果都是整数(对于抛硬币,你只能赢或输一个单位),我强烈怀疑随机数生成器在某种程度上是有偏差的。
我将代码中的几乎所有内容都声明为变体,并排除了第二个 Randomize,而不会改变偏差。那么伙计们,这是怎么回事?