概率思想
2015-08-19 09:35
183 查看
今天写最后一篇来结束这个系列,我们知道很多算法解决问题的步骤都是固定的,而概率算法每一步的选择都是随机的,
当在某些领域问题中通常比最优选择省时,所以就大大提高了算法的效率,降低了复杂度。
一:思想
这里主要讲一下“数值概率算法”,该算法常用于解决数值计算问题,并且往往只能求得问题的近似解,同一个问题同样的概率算法
求解两次可能得到的结果大不一样,不过没关系,这种“近似解”会随时间的增加而越接近问题的解。
二:特征
现实生活中,有很多问题我们其实都得不到正确答案,只能得到近似解,比如“抛硬币”求出正面向上的概率,”抛骰子“出现1点的
概率,再如:求“无理数π”的值,计算"“定积分”等等。针对这样如上的情况,使用概率算法求解是再好不过的了。
三: 举例
数值概率中,最经典的一个题目就是“计算定积分”,设f(x)=1-x2 ,计算定积分:I = ∫01 (1-x2)dx 的值。
分析:第一步: 我们画出函数f(x)=1-x2 在[0,1]的坐标图:
第二步:如果我们向矩形随机投点,那么落入“阴影区”的概率就是
P投点=S阴影/S正方形=∫01 (1-x2)dx /∫01 (1)dx=∫01 (1-x2)dx,
所以问题就演化为:求出随机点落入阴影区的概率即为定积分∫01 (1-x2)dx的近似值。
比如我们向正方形投入N个点。M个点落在阴影区,则概率P=m/n;
最后:上代码
[csharp] view
plaincopyprint?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Gailv
{
public class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("阴影区的投点概率为:" + Darts(10000));
}
}
static double Darts(int n)
{
int count = 0;
for (int i = 0; i < n; i++)
{
double x = new Random().Next(0, 100) / 100.0;
double y = new Random().Next(0, 100) / 100.0;
if (y <= 1 - Math.Pow(x, 2))
count++;
}
return (double)count / n;
}
}
}
当在某些领域问题中通常比最优选择省时,所以就大大提高了算法的效率,降低了复杂度。
一:思想
这里主要讲一下“数值概率算法”,该算法常用于解决数值计算问题,并且往往只能求得问题的近似解,同一个问题同样的概率算法
求解两次可能得到的结果大不一样,不过没关系,这种“近似解”会随时间的增加而越接近问题的解。
二:特征
现实生活中,有很多问题我们其实都得不到正确答案,只能得到近似解,比如“抛硬币”求出正面向上的概率,”抛骰子“出现1点的
概率,再如:求“无理数π”的值,计算"“定积分”等等。针对这样如上的情况,使用概率算法求解是再好不过的了。
三: 举例
数值概率中,最经典的一个题目就是“计算定积分”,设f(x)=1-x2 ,计算定积分:I = ∫01 (1-x2)dx 的值。
分析:第一步: 我们画出函数f(x)=1-x2 在[0,1]的坐标图:
第二步:如果我们向矩形随机投点,那么落入“阴影区”的概率就是
P投点=S阴影/S正方形=∫01 (1-x2)dx /∫01 (1)dx=∫01 (1-x2)dx,
所以问题就演化为:求出随机点落入阴影区的概率即为定积分∫01 (1-x2)dx的近似值。
比如我们向正方形投入N个点。M个点落在阴影区,则概率P=m/n;
最后:上代码
[csharp] view
plaincopyprint?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Gailv
{
public class Program
{
static void Main(string[] args)
{
while (true)
{
Console.WriteLine("阴影区的投点概率为:" + Darts(10000));
}
}
static double Darts(int n)
{
int count = 0;
for (int i = 0; i < n; i++)
{
double x = new Random().Next(0, 100) / 100.0;
double y = new Random().Next(0, 100) / 100.0;
if (y <= 1 - Math.Pow(x, 2))
count++;
}
return (double)count / n;
}
}
}
相关文章推荐
- AndroidTestCase测试用法
- 【appium】根据accessibility_id定位元素
- java正则中REGEX = "[\u4e00-\u9fa5]的意思?
- 27. PHP 文件创建/写入
- 线程同步与互斥:POSIX无名信号量
- CentOS 安装FTP服务
- 动态规划
- [Jenkins] 执行SoapUI的task,里面包含多个Project,发出的报告也要求包含多个Project,设置邮件内容为HTML+CSS
- javascript实现快速排
- rsync 配置和运行
- 最短路
- codeblocks进行C++开发 向工程中添加Class 发生编译错误:"No such file or directory" 解决方案
- Linux查看物理CPU个数、核数、逻辑CPU个数
- 回溯思想
- 分治思想
- 简直offer-第四章解决面试题思路(二叉树中和为某一值的路径)
- 随记
- 枚举思想
- [LeetCode] Ugly Number (A New Question Added Today)
- 向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据