2011-10-29 117 views
1

它應該是接近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 

我試圖重寫以下,但由於某種原因,Python代碼甚至還沒有接近。

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

嗯,首先,你用'1e7'將在MATLAB版本和'1e6'在Python版本... –

+0

@ JoeKington:不,仔細看...(浮動(密度)* 10.0)= 1e7 – hhh

+0

啊,對!我錯過了。 –

回答

2

我收到您的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