9

Python を使用して、モンテカルロ法で使用する多数のポイントを生成し、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。あなたの問題は、基本的に、でこぼこした設定のワンリニアです:

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

これが探しているものかどうかはわかりませんが、繰り返し実行して位置を取得enumerateできます。range

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

ループの前にヒット変数を追加し、それを 0 に初期化し、if ステートメント内でヒットを 1 ずつ増やします。最後に、ヒット数n
を使用して 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 に答える