<p>请注意,当您得到“tails”并开始一个新的“实验”时,以前的调用永远不会返回,它们只是累积,可能直到达到最大递归深度为止</p>
<p>当程序对至少9个连续的“头”(从<code>probability < 0.1</code>)进行采样时终止,并且在满足此条件之前的预期试验次数至少为<code>2 ** (9 + 1) - 2 = 1022</code>(在<a href="https://math.stackexchange.com/a/455568">MathSE</a>上的示例计算)</p>
<p>问题是这个数字可能高于默认堆栈深度(很可能是~1000;请参见<a href="https://docs.python.org/3/library/sys.html#sys.getrecursionlimit" rel="nofollow noreferrer">^{<cd3>}</a>),这就是为什么会出现错误</p>
<p>正如其他人所建议的,您可以简单地使用迭代方法:</p>
<pre class="lang-py prettyprint-override"><code>import numpy
successes = 0
while True:
rand = numpy.random.randint(2)
if rand == 1:
successes += 1
else:
probability = 50
for i in range(successes):
probability /= 2
print(str(successes) + " " + str(probability) + "%")
if probability >= 0.1:
successes = 0
else:
break
</code></pre>
<p>并且可以进一步简化<code>else</code>条件,因为<code>probability >= 0.1</code>只能在<code>successes < 9</code>时发生:</p>
<pre class="lang-py prettyprint-override"><code>import numpy
successes = 0
while True:
rand = numpy.random.randint(2)
if rand == 1:
successes += 1
else:
probability = 50 / (2 ** successes)
print(str(successes) + " " + str(probability) + "%")
if successes < 9:
assert probability >= 0.1
successes = 0
else:
break
</code></pre>