高中數(shù)學(xué)課本上曾經(jīng)寫過用計算機算得pi的近似值胳徽,用的是蒙特卡里方法。但是那時的我還不知道編程為何物江耀,今天突然又想到這個問題,嘗試了一下诉植,發(fā)現(xiàn)并不是那么難祥国,用C語言和python各實現(xiàn)了一遍。
不多說上代碼晾腔。
c語言實現(xiàn)
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <time.h>
#define MAXN 1200000//總隨機點數(shù)舌稀,這個數(shù)值越大,pi值計算的越精確灼擂,相應(yīng)的耗費更多的時間
int main(void)
{
int i=0;
double count=0.0;
double x=0.0,y=0.0,dist=0.0;
double my_pi=0;
srand((unsigned)time(NULL));
//隨機數(shù)種子被初始化
clock_t start = clock();//時間起點
for(i=0;i<MAXN;i++)
{
x = ((double)rand()/RAND_MAX);//生成0-1的隨機數(shù)
y = ((double)rand()/RAND_MAX);
dist = sqrt(x*x + y*y);//計算(x壁查,y)到原點的距離
if(dist <= 1.0)
count++;//記錄落在半圓內(nèi)的隨機點的個數(shù)
}
my_pi = 4*(count/MAXN);
clock_t finish = clock();//函數(shù)運行結(jié)束時間記錄
printf("%lf\n",my_pi);
double duration = (double)(finish - start) / CLOCKS_PER_SEC;//計算出函數(shù)所耗費的時間
printf("It costs %lf s",duration);
return 0;
}
python版 python版本為3.5X
# -*- coding:utf-8 -*-
from random import random
from math import sqrt
from time import clock
MAXN = 120000
count =0
clock()
for i in range (1,MAXN):
x, y = random(),random()
dist = sqrt(x**2+y**2)
if dist <= 1.0:
count = count + 1
pi = 4*(count/MAXN)
print("PI的值為") % pi
print("程序的運行時間是%-5.5ss") % clock()
pi.PNG
看的出來計算出的pi值離精確的pi值還有一定距離,并且數(shù)值會波動剔应,畢竟這是用概率去模擬的睡腿,樣本點足夠多,才可能精確不是领斥?
第一次使用Markdown寫東西嫉到,將就看吧o(╯□╰)o
┴┬┴┬/ ̄\_/ ̄\
┬┴┬┴▏ ▏▔▔▔▔\
┴┬┴/\ / ﹨
┬┴∕ ≡侣濉/ 『味瘛)
┴┬▏ ● ▏
┬┴▏ ▔█
┴◢██◣ \___/
┬█████◣ 〗狼/
┴█████████████◣
◢██████████████▆▄
█◤◢██◣◥█████████◤\
◥◢████ ████████◤ \
┴█████ ██████◤ ﹨
┬│ │█████◤ ▏
┴│ │ ▏
┬ ∕ ∕ ∠覆恪/▔▔▔\ ∕
┴/___/﹨ ∕ ﹨ /\
┬┴┬┴┬┴\ \ ﹨/ ﹨
┴┬┴┬┴┬┴ \___\ ﹨/▔\﹨ ▔\
▲△▲▲╓╥╥╥╥╥╥╥╥\ ∕ /▔﹨/▔﹨
』=А**╠╬╬╬╬╬╬╬╬*﹨ ∫呤辍/ //