为何我的随机游走代码仅按特定方式编写才生效?
硬币抛掷随机游走计数问题解析
你想要模拟硬币抛掷的随机游走过程,记录每次抛掷后累计的反面(tails)出现次数,但第一段代码未能实现预期的累加效果,第二段代码则正常工作,核心差异在于变量更新的逻辑。
错误代码示例
tails = [0] preceding_tails = tails[-1] for x in range (10): coin = np.random.randint(0,2) if coin == 0: tails.append(preceding_tails) else: new_tails = preceding_tails + 1 tails.append(new_tails) print(tails)
示例输出:[0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 0]
正确代码示例
tails = [0] preceding_tails = tails[-1] for x in range (10): coin = np.random.randint(0,2) if coin == 0: tails.append(preceding_tails) else: preceding_tails = preceding_tails + 1 tails.append(preceding_tails) print(tails)
示例输出:[0, 0, 1, 2, 3, 3, 3, 4, 4, 4, 5]
问题根源解析
你的猜测完全正确,问题核心是**preceding_tails变量从未被更新**:
- 在错误代码中,
preceding_tails初始值为0(取自列表第一个元素),之后就再也没被修改过。每次遇到反面时,你只是计算了new_tails = preceding_tails +1并添加到列表,但preceding_tails本身始终保持初始的0值。这就导致每次加1后只能得到1,永远无法实现累计递增。 - 而在正确代码中,遇到反面时会先更新
preceding_tails本身,把它的值加1,再将更新后的变量值添加到列表。这样每次循环时,preceding_tails都会保存最新的累计反面次数,下一次遇到反面时就能基于这个最新值继续累加,自然实现了持续递增的效果。
说白了,错误代码只把累加结果存进了列表,但没同步更新用来追踪当前累计数的变量;正确代码则同时更新了变量和列表,确保后续循环能基于最新状态计算。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

