原理: 如果均匀向正方形内撒点,那么落入阴影部分的点数与全部的点数之比是S阴影/S正 = pi / 4 只要撒入的点越多,值越相近
算法实现:
1、均匀撒点,使用随机函数来实现,产生【0,1】之间的随机数的坐标值【x,y】
2、区域判断:图中阴影部分特点是坐标原点的离坐标原点小于等于1 x *x + y * y <= 1
// MouteCalr.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <IOSTREAM>
#include <STDIO.H>
#include <STDLIB.H>
#include <CTIME>
using namespace std;
double MotenPi(int n)
{
int i, sum;
double pi;
double x, y;
sum = 0;
srand(time(NULL));
// 均匀撒点
for (i=1; i < n; i++)
{
// 【0,1】区域撒点
x = (double) rand() / RAND_MAX;
y = (double) rand() / RAND_MAX;
// 判断区域
if ((x *x + y * y) <= 1)
{
sum++;
}
}
pi = 4.0 *sum / n;
return pi;
}
int main(int argc, char* argv[])
{
int n;
double pi;
cout<<"输入撒点的个数: "<<endl;
cin>>n;
pi = MotenPi(n);
std::cout<<"pi = "<<pi<<endl;
return 0;
}
/*
输入撒点的个数:
131312312
pi = 3.14148
Press any key to continue
*/