我有这样一个代码,它基本上是抛硬币,当它击中正面(1)时,它会再次抛硬币,直到它继续抛正面的概率低于0.1%,或者当它击中反面时,它会再次开始
import numpy
def checkAgain(probability):
if(probability >= 0.1):
runCode()
def flipCoin(successes):
rand = numpy.random.randint(2)
if (rand == 1):
# true
successes += 1
flipCoin(successes)
else:
probability = 50
for i in range(successes):
probability /= 2
print(str(successes) + " " + str(probability) + "%")
checkAgain(probability)
def runCode():
successes = 0
flipCoin(successes)
runCode()
但代码只是有时有效Most of the time I get this error: maximum recursion depth exceeded in comparison
我在网上读到这可以防止“堆栈溢出”,但我不知道如何使代码运行,直到概率低于0.1
我认为这个问题有一个概念上的问题。(我可能错了)
每个翻转都独立于上一个翻转和下一个翻转,因此我要做的是计算一个几何分布(得到头部直到得到尾部的概率),然后在99%watch this处取CDF
也许这就是为什么你会得到:
如果您想继续这样做,我认为使用while循环可以像其他人指出的那样是一个解决方案
简而言之,更多的递归>;更多的内存使用。 阅读有关错误和简单案例here的更多信息。 正如Julien Sorin所提到的,您可以轻松地对循环执行相同的操作
请注意,当您得到“tails”并开始一个新的“实验”时,以前的调用永远不会返回,它们只是累积,可能直到达到最大递归深度为止
当程序对至少9个连续的“头”(从
probability < 0.1
)进行采样时终止,并且在满足此条件之前的预期试验次数至少为2 ** (9 + 1) - 2 = 1022
(在MathSE上的示例计算)问题是这个数字可能高于默认堆栈深度(很可能是~1000;请参见^{} ),这就是为什么会出现错误
正如其他人所建议的,您可以简单地使用迭代方法:
并且可以进一步简化
else
条件,因为probability >= 0.1
只能在successes < 9
时发生:相关问题 更多 >
编程相关推荐