随机化算法(2) — 数值概率算法
2012-09-22 10:10
381 查看
/article/5075811.html
接着上一篇: 随机化算法(1) — 随机数
在这章开篇推荐下chinazhangjie总结的随机算法,因为咱两看的是同一本书,所以大家也可以去参考下他的,总结的很不错。
/article/5116378.html
(顺便再PS一下,小杰也是我论坛的C/C++问题求助板块的版主,C/C++小牛)
这一章我就把书中的一个例子举出来了,感觉虽然很简单,但是很有意思。
用随机投点法计算Pi值
设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为(Pi*r*r)/(4*r*r)= Pi/4 。所以当n足够大时,k与n之比就逼近这一概率。从而,PI 约等于 (4*k)/n.
如下图:
![](http://www.wutianqi.com/wp-content/uploads/2010/12/suijitoudian.gif)
因为代码里用到了上一章《概率算法(1) — 随机数》里的RandomNumber类,所以大家可以先把前一章看看。
我把这个伪随机类再贴一遍:
const unsigned long maxshort = 65535L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber{
private:
// 当前种子
unsigned long randSeed;
public:
// 构造函数,默认值0表示由系统自动产生种子
RandomNumber(unsigned long s = 0);
// 产生0 ~ n-1之间的随机整数
unsigned short Random(unsigned long n);
// 产生[0, 1) 之间的随机实数
double fRandom();
};
// 产生种子
RandomNumber::RandomNumber(unsigned long s)
{
if(s == 0)
randSeed = time(0); //用系统时间产生种子
else
randSeed = s;
}
// 产生0 ~ n-1 之间的随机整数
unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}
// 产生[0, 1)之间的随机实数
double RandomNumber::fRandom()
{
return Random(maxshort) / double(maxshort);
}
主文件Main:
接着上一篇: 随机化算法(1) — 随机数
在这章开篇推荐下chinazhangjie总结的随机算法,因为咱两看的是同一本书,所以大家也可以去参考下他的,总结的很不错。
/article/5116378.html
(顺便再PS一下,小杰也是我论坛的C/C++问题求助板块的版主,C/C++小牛)
这一章我就把书中的一个例子举出来了,感觉虽然很简单,但是很有意思。
用随机投点法计算Pi值
设有一半径为r的圆及其外切四边形。向该正方形随机地投掷n个点。设落入圆内的点数为k。由于所投入的点在正方形上均匀分布,因而所投入的点落入圆内的概率为(Pi*r*r)/(4*r*r)= Pi/4 。所以当n足够大时,k与n之比就逼近这一概率。从而,PI 约等于 (4*k)/n.
如下图:
![](http://www.wutianqi.com/wp-content/uploads/2010/12/suijitoudian.gif)
因为代码里用到了上一章《概率算法(1) — 随机数》里的RandomNumber类,所以大家可以先把前一章看看。
我把这个伪随机类再贴一遍:
const unsigned long maxshort = 65535L;
const unsigned long multiplier = 1194211693L;
const unsigned long adder = 12345L;
class RandomNumber{
private:
// 当前种子
unsigned long randSeed;
public:
// 构造函数,默认值0表示由系统自动产生种子
RandomNumber(unsigned long s = 0);
// 产生0 ~ n-1之间的随机整数
unsigned short Random(unsigned long n);
// 产生[0, 1) 之间的随机实数
double fRandom();
};
// 产生种子
RandomNumber::RandomNumber(unsigned long s)
{
if(s == 0)
randSeed = time(0); //用系统时间产生种子
else
randSeed = s;
}
// 产生0 ~ n-1 之间的随机整数
unsigned short RandomNumber::Random(unsigned long n)
{
randSeed = multiplier * randSeed + adder;
return (unsigned short)((randSeed >> 16) % n);
}
// 产生[0, 1)之间的随机实数
double RandomNumber::fRandom()
{
return Random(maxshort) / double(maxshort);
}
主文件Main:
相关文章推荐
- 数值概率算法
- 数值概率算法(转 用来说明算法导论题目!!!)
- 算法导论 学习笔记 第五章 概率分析和随机化算法
- 关于数值概率算法及随机数
- 用C#写的数值概率算法求定积分的小程序
- 百度2014校园招聘算法——给出一组数据A=[a_0, a_1, a-2, ... a_n](其中n可变),打印出该数值元素的所有组合。
- 概率分析和随机算法 - 算法导论摘录
- 算法-->概率
- python算法-按要求打印 N*N 维 矩阵中的数值
- 51NOD 1836 战忽局的手段(矩阵乘法加速+__float128精度问题+概率期望)——算法马拉松20(告别美国大选及卡斯特罗)
- 0044算法笔记——【随机化算法】舍伍德(Sherwood)算法和线性时间选择问题
- 数值算法
- 概率生成器-算法
- Logistic回归与最小二乘概率分类算法简述与示例
- 游戏开发之随机概率的选择算法
- php中奖概率算法,可用于刮刮卡,大转盘等抽奖算法
- STL之数值算法
- 大学时的几道数值算法实现(code)
- 算法 Tricks(四)—— 判断序列中的字符/数值是否交替出现
- C语言之数值计算--级数算法