9

我一直在尝试使用 Python 创建一个脚本,该脚本可以让我生成大量点,以用于 Monte Carlo 方法来计算对 Pi 的估计。我到目前为止的脚本是这样的:

import math
import random
random.seed()

n = 10000

for i in range(n):
    x = random.random()
    y = random.random()
    z = (x,y)

    if x**2+y**2 <= 1:
        print z
    else:
        del z

到目前为止,我能够生成我需要的所有点,但我想得到的是运行脚本时产生的点数,以供以后计算使用。我不是在寻找令人难以置信的精确结果,只是一个足够好的估计。任何建议将不胜感激。

4

3 回答 3

15

如果您正在进行任何类型的重型数值计算,请考虑学习numpy. 您的问题本质上是一个带有 numpy 设置的单线性问题:

import numpy as np

N   = 10000
pts = np.random.random((N,2))

# Select the points according to your condition
idx = (pts**2).sum(axis=1)  < 1.0
print pts[idx], idx.sum()

给予:

[[ 0.61255615  0.44319463]
 [ 0.48214768  0.69960483]
 [ 0.04735956  0.18509277]
 ..., 
 [ 0.37543094  0.2858077 ]
 [ 0.43304577  0.45903071]
 [ 0.30838206  0.45977162]], 7854

最后一个数字是计数的事件数,即半径小于1的点的计数。

于 2012-11-19T20:44:22.617 回答
2

不确定这是否是您正在寻找的,但您可以继续运行并enumeraterange迭代中获得位置:

In [1]: for index, i in enumerate(xrange(10, 15)):
   ...:     print index + 1, i
   ...:
   ...:
1 10
2 11
3 12
4 13
5 14

在这种情况下,index + 1将表示正在创建的当前点(index其本身将是在给定迭代开始时创建的点的总数)。此外,如果您使用的是 Python 2.x,xrange则通常更适合此类迭代,因为它不会将整个列表加载到内存中,而是根据需要访问它。

于 2012-11-19T20:26:22.663 回答
1

只需在循环之前添加hits变量,将其初始化为 0 并在 if 语句中将 hits 递增1最后,您可以使用hitsn
计算 PI 值。

import math
import random
random.seed()

n = 10000
hits = 0  # initialize hits with 0

for i in range(n):
    x = random.random()
    y = random.random()
    z = (x,y)

    if x**2+y**2 <= 1:
        hits += 1
    else:
        del z

# use hits and n to compute PI
于 2012-11-19T20:34:51.503 回答