计算为随机总和(蒙特卡罗)

时间:2016-05-13 20:04:08

标签: python python-3.x montecarlo pi

我需要通过评估总和来估算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'对象不能解释为整数

3 个答案:

答案 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