我需要通过评估总和来估算pi的值 =(1 /(+ 1))Σ1/(1 - 2)^(1/2)其中均匀分布的随机数。
import math
import random
def Pi(N,x):
S = (1/(N+1))*(1/(1-x**2)**(0.5))
return S
def function(N,a,b):
x = random.uniform(a,b)
total = sum(Pi(N,x))
return total
print(function(1000,0.0,1.0))
输出基本上就是给我这个。
TypeError:'float'对象不能解释为整数
答案 0 :(得分:3)
您在sum
的结果上致电Pi
。但是Pi
返回一个数字,而不是一个可迭代的数字。只需删除对sum
的通话即可。 sum
采用可迭代(列表,字典,元组等)并将所有值相加。因此,当你传递它无法迭代的东西时(如浮点数),它不能求和任何东西,因为没有迭代的值。
import random
def Pi(N,x):
S = (1/(N+1))*(1 / (1-x**2) ** 0.5)
return S
def function(N,a,b):
x = random.uniform(a,b)
total = Pi(N,x)
return total
print(function(1000,0.0,1.0))
答案 1 :(得分:1)
我非常确定你想要运行Pi
函数N
次,而不只是一次。为此,你需要一种循环。由于您想使用内置sum
,因此生成器表达式非常自然:
def function(N, a, b):
total = sum(Pi(N, random.uniform(a, b)) for _ in range(N))
return total
但是,这并不会返回与pi
太接近的任何内容。也许是pi/2
?我不知道你的公式应该如何运作得足以发现计算中的问题。
答案 2 :(得分:0)
你实际上是在对pi / 2进行抽样,而你真的不需要N
函数中的Pi
。你应该在总结之后在结尾处申请
import math
import random
def Pi(x):
return 1.0/math.sqrt(1.0 - x*x)
random.seed(12345)
N = 100000
total = sum(Pi(random.uniform(0.0, 1.0)) for _ in range(N))
total /= float(N+1)
print(2.0*total)
将产生
3.1429294210892524