You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用蒙特卡洛模拟计算自然常数e出现NameError报错如何解决

错误原因
  • 类内实例方法调用未加self前缀:exceed_dict方法中调用random_points、calculating_e方法中调用exceed_dict时,缺少实例前缀self.,Python会将其识别为全局函数查找,无法找到对应定义触发NameError。
  • 实例属性访问未加self前缀:calculating_e方法中使用的N是__init__中定义的实例属性,需通过self.N访问,直接写N会被判定为未定义全局变量,触发NameError。
  • 额外逻辑缺陷:random_points方法每次调用前未重置累加变量self.s,首次调用后s值就会大于1,后续所有调用都会直接返回1,导致最终计算结果完全错误。
修复后可运行代码
# 用蒙特卡洛模拟计算自然常数e的取值
import random

class FindE:
    def __init__(self):
        self.s = 0
        self.N = 1000000
    
    def random_points(self):
        self.s = 0 # 每次调用先重置累加值
        for i in range(1,100000):
            x = random.uniform(0, 1)
            self.s += x
            if self.s > 1.0:
                return i

    def exceed_dict(self, N):
        d = dict()
        for _ in range(N):
            count = self.random_points() # 加self前缀调用实例方法
            if count not in d:
                d[count] = 0
            d[count] += 1
        return d

    def calculating_e(self):
        d = self.exceed_dict(self.N) # 加self调用方法,用self.N访问实例属性
        return sum([k*v for k, v in d.items()]) / self.N

e = FindE()
print(e.calculating_e())
效果说明

代码运行后会输出e的近似值,样本量self.N越大,输出结果越接近自然常数e的真实值(约2.71828)。

内容的提问来源于stack exchange,提问作者batyr meredov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:54:02