2011-10-29 4 views
1

私は以下のが、Pythonのコードは似ても似つかない何らかの理由を書き換えしようとしています0.3モンテカルロとエリア-calculation

$ cat monte.py 
import random,math 
density=int(1e6) 
x = [random.uniform(0,1)*7*math.pi for _ in range(density)] 
y = [random.uniform(0,1) for _ in range(density)] 
i = [math.sin(xx)*math.cos(xx) > yy for (xx,yy) in zip(x,y)] 

print sum(i)/(float(density)*10.0)*7*math.pi 

$ python monte.py 
0.350184850795 

に近くなければなりません。

x = rand(1, 1000000)*7pi; 
y = rand(1, 1000000); 
i = sin(x).* cos(x) >y; 
Area3 = (sum(i)/10000000)*7pi; 
+0

まあ、まず第、あなたはPythonのバージョンでMatlabのバージョンと '1e6'で' 1e7'で割っている... –

+0

@ジョーキントン:いいえ、慎重に見てください...(フロート(密度)* 10.0)= 1e7 – hhh

+0

ああ、そうです!私は逃しました。 –

答えて

2

私はあなたのMathWorks社のMATLABとPythonのバージョン間で同一の結果を得ている...あなたは、MATLABのバージョンが〜2あなたを与え、そしてない〜0.35されていることを確認していますか?例えば

MATLAB:

x = rand(1, 1000000)*7*pi; 
y = rand(1, 1000000); 
i = sin(x).* cos(x) >y; 
Area3 = (sum(i)/10000000)*7*pi 

この利回り:0.3511

あなたの純粋なPythonのバージョン:

import random,math 
density=int(1e6) 
x = [random.uniform(0,1)*7*math.pi for _ in range(density)] 
y = [random.uniform(0,1) for _ in range(density)] 
i = [math.sin(xx)*math.cos(xx) > yy for (xx,yy) in zip(x,y)] 

print sum(i)/(float(density)*10.0)*7*math.pi 

この利回り:0.347935156296

ベースのnumpyの:

import numpy as np 
x = np.random.random(1e6) * 7 * np.pi 
y = np.random.random(x.size) 
i = np.sin(x) * np.cos(x) > y 
print 7 * np.pi * i.sum()/(10 * x.size) 

この利回り:0.350475133957

+0

はい、そうです、優れたnumpyの解決のために受け入れられました!私は奇妙な車輪を再発明していたことを知っていました。 – hhh