• 蒙特卡罗算法(Monte Carlo method)


    蒙特卡罗方法概述

    蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法,以概率和统计理论方法为基础的一种计算方法,是使用随机数(或更常见的伪随机数)来解决很多计算问题的方法。将所求解的问题同一定的概率模型相联系,用电子计算机实现统计模拟或抽样,以获得问题的近似解。为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。

    蒙特卡罗方法的基本思想

    用事件发生的“频率”来决定事件的“概率”。高速电子计算机使得用数学方法在计算机上大量、快速地模拟这样的试验成为可能。

    蒙特卡罗方法的基本原理

    设有统计独立的随机变量Xi(i=1,2,3,…,k),其对应的概率密度函数分别为fx1,fx2,…,fxk,功能函数式为Z=g(x1,x2,…,xk)。

    首先根据各随机变量的相应分布,产生N组随机数x1,x2,…,xk值,计算功能函数值 Zi=g(x1,x2,…,xk)(i=1,2,…,N),若其中有L组随机数对应的功能函数值Zi≤0,则当N→∞时,根据伯努利大数定理正态随机变量的特性有:结构失效概率,可靠指标。

    从蒙特卡罗方法的思路可看出,该方法回避了结构可靠度分析中的数学困难,不管状态函数是否非线性、随机变量是否非正态,只要模拟的次数足够多,就可得到一个比较精确的失效概率和可靠度指标。

    蒙特卡罗方法分子模拟计算的步骤

    蒙特卡罗方法实施步骤:

    1、通过敏感性分析,确定随机变量;

    2、构造随机变量的概率分布模型;

    3、为各输入随机变量抽取随机数;

    4、将抽得的随机数转化为各输入随机变量的抽样值;

    5、将抽样值组成一组项目评价基础数据;

    6、根据基础数据计算出评价指标值;

    7、整理模拟结果所得评价指标的期望值、方差、标准差和它的概率分布及累计概率,绘制累计概率分布图,计算项目可行或不可行的概率。

    蒙特卡罗方法应用

    1.求π

    #include <bits/stdc++.h>
    
    #define MAX_ITERS 10000000
    
    using namespace std;
    
    double Rand(double L, double R)
    {
        return L + (R - L) * rand() * 1.0 / RAND_MAX;
    }
    
    double GetPi()
    {
        srand(time(NULL));
        int cnt = 0;
        for(int i = 0; i < MAX_ITERS; i++)
        {
            double x = Rand(-1, 1);
            double y = Rand(-1, 1);
            if(x * x + y * y <= 1)
                cnt++;
        }
        return cnt * 4.0 / MAX_ITERS;
    }
    
    int main()
    {
        for(int i = 0; i < 10; i++)
            cout <<  fixed << setprecision(10)<<GetPi() << endl;
        return 0;
    }

    2.求e

    #include <bits/stdc++.h>
    
    #define MAX_ITERS 10000000
    
    using namespace std;
    
    struct Point
    {
        double x, y;
    };
    
    double Rand(double L, double R)
    {
        return L + (R - L) * rand() * 1.0 / RAND_MAX;
    }
    
    Point getPoint()
    {
        Point t;
        t.x = Rand(1.0, 2.0);
        t.y = Rand(0.0, 1.0);
        return t;
    }
    
    double getResult()
    {
        int m = 0;
        int n = MAX_ITERS;
        srand(time(NULL));
        for(int i = 0; i < n; i++)
        {
            Point t = getPoint();
            double res = t.x * t.y;
            if(res <= 1.0)
                m++;
        }
        return pow(2.0, 1.0 * n / m);
    }
    
    int main()
    {
        for(int i = 0; i < 20; i++)
            cout << fixed << setprecision(10) << getResult() << endl;
        return 0;
    }
    //precision() 返回当前的浮点数精度值
    //precision(val) 设置val为新的浮点数精度值, 并返回原值
    //setf(flags) 添加格式标志flags, 返回所有标志的原本状态.
    //showpos    正数前面加上+号
    //fixed 使用小数计数法
    //scientific 使用科学计数法
    //uppercase 使用大写字符
    //showbase  显示数字的进制
    //boolalpha    bool值使用字符表示 , true或者false
    //noboolalpha     bool使用0和1表示
    //left   靠左对齐
    //right  靠右对齐
    //internal 字符靠左对齐, 数字卡右对齐

     参考:

    [1]http://blog.csdn.net/acdreamers/article/details/44978591

    [2]MBA智库:http://wiki.mbalib.com/wiki/%E8%92%99%E7%89%B9%E5%8D%A1%E7%BD%97%E6%96%B9%E6%B3%95

  • 相关阅读:
    利用Form组件和ajax实现的注册
    基于ajax实现的登录
    【字符串】【kmp模板】
    【字符串入门专题1】 I
    【字符串入门专题1】A
    【最短路入门专题1】H
    【最短路入门专题1】D
    【最短路入门专题1】E
    【最短路径入门专题1】K
    【多校连萌2】D题 ykc想吃好吃的【补题】【最大子段和变形题】
  • 原文地址:https://www.cnblogs.com/xujiayi/p/7768318.html
Copyright © 2020-2023  润新知