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
相关产品推荐
相关产品推荐

