1、蒙特卡罗算法

基本概述

       蒙特卡罗(Monte Carlo)方法,又称随机抽样或统计试验方法。传统的经验方法由于不能逼近真实的物理过程,很难得到满意的结果,而蒙特卡罗方法由于能够真实地模拟实际物理过程,故解决问题与实际非常符合,可以得到很圆满的结果。

在实际应用中常会遇到一些问题,不论采用确定性算法或随机化算法都无法保证每次都能得到正确的解答。蒙特卡罗算法则在一般情况下可以保证对问题的所有实例都以高概率给出正确解,但是通常无法判定一个具体解是否正确
     设p是一个实数,且1/2<p<1。如果一个蒙特卡罗算法对于问题的任一实例得到正确解的概率不小于p,则称该蒙特卡罗算法是p正确的,且称p-1/2是该算法的优势。
如果对于同一实例,蒙特卡罗算法不会给出2个不同的正确解答,则称该蒙特卡罗算法是一致的。
     有些蒙特卡罗算法除了具有描述问题实例的输入参数外,还具有描述错误解可接受概率的参数。这类算法的计算时间复杂性通常由问题的实例规模以及错误解可接受概率的函数来描述。

原理思想

当所要求解的问题是某种事件出现的概率,或者是某个随机变量的期望值时,它们可以通过某种“试验”的方法,得到这种事件出现的频率,或者这个随机变数的平均值,并用它们作为问题的解。这就是蒙特卡罗方法的基本思想。蒙特卡罗方法通过抓住事物运动的几何数量和几何特征,利用数学方法来加以模拟,即进行一种数字模拟实验。它是以一个概率模型为基础,按照这个模型所描绘的过程,通过模拟实验的结果,作为问题的近似解。

主要步骤

蒙特卡罗解题归结为三个主要步骤:构造或描述概率过程;实现从已知概率分布抽样;建立各种估计量。

 1)构造或描述概率过程: 对于本身就具有随机性质的问题,如粒子输运问题,主要是正确描述和模拟这个概率过程,对于本来不是随机性质的确定性问题,比如计算定积分,就必须事先构造一个人为的概率过程,它的某些参量正好是所要求问题的解。即要将不具有随机性质的问题转化为随机性质的问题。

2)实现从已知概率分布抽样: 构造了概率模型以后,由于各种概率模型都可以看作是由各种各样的概率分布构成的,因此产生已知概率分布的随机变量(或随机向量),就成为实现蒙特卡罗方法模拟实验的基本手段,这也是蒙特卡罗方法被称为随机抽样的原因。最简单、最基本、最重要的一个概率分布是(0,1)上的均匀分布(或称矩形分布)。随机数就是具有这种均匀分布的随机变量。随机数序列就是具有这种分布的总体的一个简单子样,也就是一个具有这种分布的相互独立的随机变数序列。产生随机数的问题,就是从这个分布的抽样问题。在计算机上,可以用物理方法产生随机数,但价格昂贵,不能重复,使用不便。另一种方法是用数学递推公式产生。这样产生的序列,与真正的随机数序列不同,所以称为伪随机数,或伪随机数序列。不过,经过多种统计检验表明,它与真正的随机数,或随机数序列具有相近的性质,因此可把它作为真正的随机数来使用。由已知分布随机抽样有各种方法,与从(0,1)上均匀分布抽样不同,这些方法都是借助于随机序列来实现的,也就是说,都是以产生随机数为前提的。由此可见,随机数是我们实现蒙特卡罗模拟的基本工具。 建立各种估计量: 一般说来,构造了概率模型并能从中抽样后,即实现模拟实验后,我们就要确定一个随机变量,作为所要求的问题的解,我们称它为无偏估计。  
     3)建立各种估计量:相当于对模拟实验的结果进行考察和登记,从中得到问题的解。 例如:检验产品的正品率问题,我们可以用1表示正品,0表示次品,于是对每个产品检验可以定义如下的随机变数Ti,作为正品率的估计量: 于是,在N次实验后,正品个数为: 显然,正品率p为: 不难看出,Ti为无偏估计。当然,还可以引入其它类型的估计,如最大似然估计,渐进有偏估计等。但是,在蒙特卡罗计算中,使用最多的是无偏估计。 用比较抽象的概率语言描述蒙特卡罗方法解题的手续如下:构造一个概率空间(W ,A,P),其中,W 是一个事件集合,A是集合W 的子集的s 体,P是在A上建立的某个概率测度;在这个概率空间中,选取一个随机变量q (w ),w Î W ,使得这个随机变量的期望值 正好是所要求的解Q ,然后用q (w )的简单子样的算术平均值作为Q 的近似值。

2、主元素问题

问题描述

     设T[1:n]是一个含有n个元素的数组。当|{i|T[i]=x}|>n/2时,称元素x是数组T的主元素。 例如:数组T[]={5,5,5,5,5,5,1,3,4,6}中,元素T[0:5]为数组T[]的主元素。

问题求解

      算法随机选择数组元素x,由于数组T的非主元素个数小于n/2,所以,x不为主元素的概率小于1/2。因此判定数组T的主元素存在性的算法是一个偏真1/2正确的算法。50%的错误概率是不可容忍的,利用重复调用技术将错误概率降低到任何可接受的范围内。对于任何给定的>0,算法majorityMC重复调用次算法majority。它是一个偏真蒙特卡罗算法,且其错误概率小于。算法majorityMC所需的计算时间显然是

算法具体代码如下:

//随机化算法 蒙特卡罗算法 主元素问题
#include "stdafx.h"
#include "RandomNumber.h"
#include <cmath>
#include <iostream>
using namespace std;//判定主元素的蒙特卡罗算法
template<class Type>
bool Majority(Type *T,int n)
{RandomNumber rnd;int i = rnd.Random(n);Type x = T[i];    //随机选择数组元素int k = 0;for(int j=0; j<n; j++){if(T[j] == x){k++;}}return (k>n/2);    //k>n/2时,T含有主元素
}//重复k次调用算法Majority
template<class Type>
bool MajorityMC(Type *T,int n,double e)
{int k = ceil(log(1/e)/log((float)2));for(int i=1; i<=k; i++){if(Majority(T,n)){return true;}}return false;
}int main()
{int n = 10;float e = 0.001;int a[] = {5,5,5,5,5,5,1,3,4,6};cout<<"数组a的元素如下:"<<endl;for(int i=0; i<10; i++){cout<<a[i]<<" ";}cout<<endl;cout<<"调用MajorityMC判断数组是否含有主元素结果是:"<<MajorityMC(a,n,e)<<endl;
}

程序运行结果如图:


     3、素数测试问题

数学原理

Wilson定理:对于给定的正整数n,判定n是一个素数的充要条件是(n-1)! -1(mod n)。
     费尔马小定理:如果p是一个素数,且0<a<p,则a^(p-1)(mod p)。 
     二次探测定理:如果p是一个素数,且0<x<p,则方程x^21(mod p)的解为x=1,p-1。

Carmichael数:费尔马小定理是素数判定的一个必要条件。满足费尔马小定理条件的整数n未必全是素数。有些合数也满足费尔马小定理的条件,这些合数称为Carmichael数。前3个Carmichael数是561,1105,1729。Carmichael数是非常少的,在1~100000000的整数中,只有255个Carmichael数。

求a^m(mod n)的算法

设m的二进制表示为bkbk-1…b1b0(bk=1)。
     例:m=41=101001(2),bkbk-1…b1b0=101001,(k=5)。
     可以这样来求a^m:初始C←1。
     b5=1:C←C^2(=1),∵bk=1,做C←a*C(=a);
     b5b4=10:C←C^2(=a^2),∵bk-1=0,不做动作;
     b5b4b3=101:C←C^2(=a^4),∵bk-2=1,做C←a*C(=a^5);
     b5b4b3b2=1010:C←C^2(=a^10),∵bk-3= b2=0,不做动作;
     b5b4b3b2b1=10100:C←C^2(=a^20),∵bk-4= b1=0,不做动作;
     b5b4b3b2b1b0=101001:C←C^2(=a^40),∵bk-5= b0=1,做C←a*C(=a^41)。
     最终要对am求模,而求模可以引入到计算中的每一步:
     即在求得C2及a*C之后紧接着就对这两个值求模,然后再存入C。
     这样做的好处是存储在C中的最大值不超过n-1,
     于是计算的最大值不超过max{(n-1)^2,a(n-1)}。
     因此,即便am很大,求am(mod n)时也不会占用很多空间。

程序具体代码如下:

//随机化算法 蒙特卡罗算法 素数测试问题
#include "stdafx.h"
#include "RandomNumber.h"
#include <cmath>
#include <iostream>
using namespace std;//计算a^p mod n,并实施对n的二次探测
void power(unsigned int a,unsigned int p,unsigned int n,unsigned int &result,bool &composite)
{unsigned int x;if(p == 0){result = 1;}else{power(a,p/2,n,x,composite);      //递归计算result = (x*x)%n;                //二次探测if((result == 1) && (x!=1) && (x!=n-1)){composite  = true;}if((p%2)==1){result = (result*a)%n;}}
}//重复调用k次Prime算法的蒙特卡罗算法
bool PrimeMC(unsigned int n,unsigned int k)
{RandomNumber rnd;unsigned int a,result;bool composite = false;for(int i=1; i<=k; i++){a = rnd.Random(n-3)+2;power(a,n-1,n,result,composite);if(composite || (result!=1)){return false;}}return true;
}int main()
{int k = 10;for(int i=1010;i<1025;i++){cout<<i<<"的素数测试结果为:"<<PrimeMC(i,k)<<endl;}return 0;
}

程序运行结果如图:

0049算法笔记——【随机化算法】蒙特卡罗算法,主元素问题,素数测试问题相关推荐

  1. 算法设计与分析——蒙特卡罗算法(简单、通俗、易懂)C++

    算法设计与分析--蒙特卡罗算法(简单.通俗.易懂) 虽然都是文字描述,但都是较为通俗的语言,相信你看完应该能理解 在实际应用中会遇到一些问题,不论采用确定性算法还是随机性算法,都无法保证每次能到到正确 ...

  2. 机器学习算法笔记——P22 sklearn—LASSO算法

    机器学习算法笔记--P22 sklearn-LASSO算法 #!/usr/bin/env python # coding: utf-8# In[1]:import numpy as np from n ...

  3. 算法笔记:Kmeans聚类算法简介

    算法笔记:Kmeans聚类算法简介 1. Kmeans算法简介 2. Kmeans算法细节 3. Kmeans算法收敛性证明 4. Kmeans算法的变体 1. cosine距离变体 2. 点积距离版 ...

  4. 算法设计与分析——蒙特卡罗算法判定两个集合是否相等

    文章目录 题目描述 思路分析 蒙特卡罗知识回顾 概述 基本概念 具体问题具体分析 具体代码的运行 分析与总结 题目描述 给定两个集合S和T,设计一个判定S和T是否相等的蒙特卡罗算法 思路分析 蒙特卡罗 ...

  5. 【算法笔记题解】《算法笔记知识点记录》第三章——入门模拟1——简单模拟

    如果喜欢大家还希望给个收藏点赞呀0.0 相关知识点大家没基础的还是要看一下的,链接: <算法笔记知识点记录>第三章--入门模拟 由于放原题的话文章实在太长,所以题多的话我只放思路和题解,大 ...

  6. 经典算法笔记:无监督算法(聚类、降维)

    本文是吴恩达老师的机器学习课程[1]的笔记和代码复现部分(聚类.降维). 作者:黄海广[2] 备注:笔记和作业(含数据.原始作业文件).视频都在github[3]中下载. 我将陆续将课程笔记和课程代码 ...

  7. 算法笔记 (四)算法的逻辑结构和物理结构

    逻辑 逻辑一词在定义的时候有狭义和广义之分.      狭义的逻辑可以理解为思维逻辑,再大一点就是研究思维活动规律的学科,即逻辑学. 广义的概念不仅仅指思维方面,还指事物客观规律.从形式上又分为形式逻 ...

  8. 算法笔记——15个瓶子,4只老鼠,测试哪瓶有毒

    看到今天一道算法题,就写了一下自己的思路,希望有大牛,看到这个题,能提出更好的想法,再进行交流学习,我只用了一点简单的C++ 进行实现 有15个瓶子,其中最多有一瓶有毒,现在有四只老鼠,喝了有毒的水之 ...

  9. 算法笔记:A2-A4-RSRQ切换算法

    1 LTE 切换 LTE切换是移动通信网络中的一个过程,移动设备在保持无间断服务的情况下,将其连接从一个基站切换到另一个基站.当移动设备离开当前基站的覆盖范围或网络资源拥塞时,就需要进行切换. LTE ...

最新文章

  1. 进程间通信——POSIX 有名信号量与无名信号量
  2. vue在less中使用css3 calc 被解析 的问题
  3. spring BeanFactory概述
  4. redhat/centos 搭建svn服务器环境
  5. java制作五子棋的论文,基于java的五子棋的设计与实现.docx
  6. matlab中GUI的属性检查器中的XLimMode是什么_如何在Matlab中使用GUI做一个简易音乐播放器? ---- (二)GUIDE...
  7. android AVB2.0学习总结
  8. Solrj 存储一个point类型的字段
  9. gdal mysql乱码_GDAL读取S-57海图数据中文属性值乱码问题解决(续)
  10. NAT技术代理服务器
  11. 2008年入职华为,开始运维生涯
  12. 空间三维技术重现“山水林田湖草”管理沙盘
  13. 【linux学习笔记】Linux网络管理综合项目实训任务书
  14. 常用Windows 运行命令
  15. 「ZigBee模块」基础实验(2)按键
  16. 一张纸的厚度是0.0001米,将纸对折,问对折多少次厚度超过珠穆朗玛峰8848米
  17. 基于Laravel开发的Diy手机壳在线定制系统源码
  18. WIN7 WIN10 资源管理器不能自动刷新的解决方法
  19. 【Python基础】对象的浅拷贝与深拷贝
  20. 磁盘管理器/磁盘管理工具给电脑硬盘分区

热门文章

  1. Python 条件控制语句
  2. Google搜索引擎的新功能
  3. github的SSH配置
  4. 2021.12.04【宏基因组】|宏基因组流程搭建进展梳理
  5. mysql查询表的索引_MySQL查看表索引
  6. Apache Mina:一个简单的tcp通信demo
  7. bugkuctf 杂项-待续
  8. x58和x79服务器性能,革了X58的命!新旗舰X79究竟改变了啥?
  9. 【明星项目】看看社保—自研远程社保生存认证,让领社保的老人少跑腿
  10. 常用数据规范化方法: min-max规范化,零-均值规范化等