用随机投点法计算PI值
2015-12-11 13:16
288 查看
#include "iostream" #include "ctime" #include "iomanip" using namespace std; const unsigned long maxshort = 65536L; const unsigned long multiplier = 1194211693L; const unsigned long adder = 12345L; class RandomNumber { private: unsigned long randSeed; //当前种子 public: RandomNumber(unsigned long s=0); //构造函数,默认值0表示由系统自动产生种子 unsigned short Random(unsigned long n); //产生0:n-1之间的随机整数 double fRandom(void); //产生[0:1)之间的随机实数 }; RandomNumber::RandomNumber(unsigned long s) //产生种子 { if(s==0) randSeed = time(0); //用系统时间产生种子 else randSeed = s; //用户提供种子 } unsigned short RandomNumber::Random(unsigned long n) //产生0:n-1之间的随机整数 { randSeed = multiplier * randSeed + adder; return (unsigned short) ((randSeed>>16)%n); //高16位随机性较好,右移16位后,映射到(0~n-1)范围内 } double RandomNumber::fRandom(void) //产生[0,1)之间的随机整数 { return Random(maxshort)/double(maxshort); //产生0~(maxshort-1)间的随机整数,在除以maxshort } //用随机投点法计算PI值 double Darts(int n) { static RandomNumber dart; int k = 0; for(int i=1; i<=n; i++) { double x = dart.fRandom(); //横坐标[0,1)之间 double y = dart.fRandom(); //纵坐标[0,1)之间 if((x*x + y*y)<=1) //如果落在圆内 k++; //次数增加 } return 4*k/double(n); //所投点落入圆内的概率为 k/n = pi/4 } int main() { const long num = 50000L; double pi = Darts(num); printf("PI=%f\n", pi); return 0; }
相关文章推荐
- window 7下用U盘安装ubuntu14.04双系统
- ABP理论学习之N层架构
- 最全Pycharm教程(20)——Pycharm编辑器功能之模板应用
- VMware 中linux(redhat)增加硬盘空间
- linux设备驱动程序和软硬件交互——以3w-9xxxx RAID卡驱动为例
- nginx 变量
- Cmder+Sublime Text“基友”实验
- LintCode:两个字符串是变位词
- Java HashMap的死循环
- JS替换非正则替换
- 网易前端微专业,JavaScript程序设计基础篇:函数
- aerospike工具集——ascli
- Aop/AspectJ
- #学习笔记#(12)仿360logo-photoshop
- WPF 开发 WebBrowser
- RAM——[HAOI2007]理想的正方形
- BZOJ 1066: [SCOI2007]蜥蜴( 最大流 )
- 同步网络请求 类封装,包括get请求和post请求,可选择是否进行JSON解析
- npm install —— 从一个简单例子,看本地安装与全局安装的区别
- Mac 应用开发--Cocoa运用程序显示或隐藏MainNemu