• 算法洗脑系列(8篇)——第八篇 概率思想


       

           今天写最后一篇来结束这个系列,我们知道很多算法解决问题的步骤都是固定的,而概率算法每一步的选择都是随机的,

    当在某些领域问题中通常比最优选择省时,所以就大大提高了算法的效率,降低了复杂度。

    一:思想

          这里主要讲一下“数值概率算法”,该算法常用于解决数值计算问题,并且往往只能求得问题的近似解,同一个问题同样的概率算法

    求解两次可能得到的结果大不一样,不过没关系,这种“近似解”会随时间的增加而越接近问题的解。

    二:特征

         现实生活中,有很多问题我们其实都得不到正确答案,只能得到近似解,比如“抛硬币”求出正面向上的概率,”抛骰子“出现1点的

     概率,再如:求“无理数π”的值,计算"“定积分”等等。针对这样如上的情况,使用概率算法求解是再好不过的了。

    三: 举例

       数值概率中,最经典的一个题目就是“计算定积分”,设f(x)=1-x2 ,计算定积分:I = ∫0 (1-x2)dx 的值。   

    分析:第一步: 我们画出函数f(x)=1-x2 在[0,1]的坐标图:

    第二步:如果我们向矩形随机投点,那么落入“阴影区”的概率就是

              P投点=S阴影/S正方形=∫0 (1-x2)dx /∫0 (1)dx=∫0 (1-x2)dx,

              所以问题就演化为:求出随机点落入阴影区的概率即为定积分∫0 (1-x2)dx的近似值。

              比如我们向正方形投入N个点。M个点落在阴影区,则概率P=m/n;

    最后:上代码

     1 using System;
    2 using System.Collections.Generic;
    3 using System.Linq;
    4 using System.Text;
    5
    6 namespace Gailv
    7 {
    8 public class Program
    9 {
    10 static void Main(string[] args)
    11 {
    12 while (true)
    13 {
    14 Console.WriteLine("阴影区的投点概率为:" + Darts(10000));
    15 }
    16 }
    17
    18 static double Darts(int n)
    19 {
    20 int count = 0;
    21
    22 for (int i = 0; i < n; i++)
    23 {
    24 double x = new Random().Next(0, 100) / 100.0;
    25
    26 double y = new Random().Next(0, 100) / 100.0;
    27
    28 if (y <= 1 - Math.Pow(x, 2))
    29 count++;
    30 }
    31 return (double)count / n;
    32 }
    33 }
    34 }

  • 相关阅读:
    解决Win10图片打开方式没有“Windows照片查看器”问题
    20199305 2019-2020-2 《网络攻防实践》第四周作业
    20199305 2019-2020-2 《网络攻防实践》第三周作业
    20199305 2019-2020-2 《网络攻防实践》第二周作业
    20199305 2019-2020-2 《网络攻防实践》第一周作业
    20199305 《网络攻防实践》假期作业
    补交作业:第六周 SumN
    外设驱动程序设计-2
    外设驱动程序设计-1
    2019-2020-1 20199305《Linux内核原理与分析》第十二周作业
  • 原文地址:https://www.cnblogs.com/huangxincheng/p/2350275.html
Copyright © 2020-2023  润新知