蒙特卡罗算法:PI

来源:互联网 发布:矩阵和行列式的转换 编辑:程序博客网 时间:2024/06/05 16:43

原理: 如果均匀向正方形内撒点,那么落入阴影部分的点数与全部的点数之比是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  */


原创粉丝点击