蒙特卡罗方法(Monte Carlo method)

GitHub地址:戳我看源码>>>>蒙特卡罗方法

概述

  • 蒙特卡罗方法又称统计模拟法、随机抽样技术,是一种随机模拟方法
  • 用事件发生的“频率”来决定事件的“概率”
  • 用数学方法在计算机上大量、快速地模拟试验,以获得问题的近似解
  • 为象征性地表明这一方法的概率统计特征,故借用赌城蒙特卡罗命名。

应用

求PI值

思路
PI
  • 用蒙特卡罗算法的思想就是随机往正方形里打点,圆内的点个数之和近似于圆的面积,打点总数近似于正方形的面积
  • PI = 4 * cirleArea / squareArea
  • PI = 4 * 圆内的点 / 打点总数
代码
const _inCircle = Symbol('inCircle')
const _calcPI = Symbol('calcPI')
const _addPoint = Symbol('addPoint')

class PI {
  constructor(N = 1000000000, consoleInterval = 100000000) {
    this.N = N // 预计打点次数
    this.r = 100 // 半径
    this.cirleArea = 0 // 圆内点个数
    this.squareArea = 0 // 已打点个数
    this.consoleInterval = consoleInterval // 每打多少个点打印一次PI
  }

  // 判断是否落在圆内 包含圆边上的点
  [_inCircle](x, y) {
    return Math.pow(this.r - x, 2) + Math.pow(this.r - y, 2) <= Math.pow(this.r, 2)
  }

  // 计算目前的PI值
  [_calcPI]() {
    // SquareArea不包含4条边上的点 所以加上4条边的长度
    return 4 * this.cirleArea / (this.squareArea + 8 * this.r)
  }

  // 随机打点
  [_addPoint]() {
    // 正方形内随机打点的坐标 结果没有包含四天边上的点
    let x = Math.random() * 2 * this.r
    let y = Math.random() * 2 * this.r
  
    this.squareArea++
  
    if (this[_inCircle](x, y)) {
      this.cirleArea++
    }
  }

  // 获取并打印PI
  getPI() {
    for (let i = 1; i < this.N + 1; i++) {
      this[_addPoint]()
      if (i % this.consoleInterval === 0) {
        console.log(this.cirleArea, this.squareArea, 'PI', this[_calcPI]())
      }
    }
  }
}

// 实例化PI 获取PI值
new PI().getPI()
打印结果
consolePI

从图中可以看到 PI值接近于理论值 而且数据量越大越接近理论值

三门问题

描述

三门问题(Monty Hall problem)亦称为蒙提霍尔问题、蒙特霍问题或蒙提霍尔悖论,大致出自美国的电视游戏节目Let's Make a Deal。问题名字来自该节目的主持人蒙提·霍尔(Monty Hall)。参赛者会看见三扇关闭了的门,其中一扇的后面有一辆汽车,选中后面有车的那扇门可赢得该汽车,另外两扇门后面则各藏有一只山羊。当参赛者选定了一扇门,但未去开启它的时候,节目主持人开启剩下两扇门的其中一扇,露出其中一只山羊。主持人其后会问参赛者要不要换另一扇仍然关上的门。问题是:换另一扇门会否增加参赛者赢得汽车的机率?如果严格按照上述的条件,即主持人清楚地知道,自己打开的那扇门后是羊,那么答案是会。不换门的话,赢得汽车的几率是1/3。换门的话,赢得汽车的几率是2/3。

思路

三扇门分别用1、2、3表示,随机一扇门为有奖品的,随机一扇门为参赛者所选择的,如果两者相等则参赛者不换就赢了反之失败,如果不相等则参赛者换就一定会赢反之失败

代码
const _run = Symbol('_run')
const _calcRate = Symbol('_calcRate')

class MontyHall {
  constructor(change = true, N = 10000000, consoleInterval = N / 10) {
    this.win = 0 // 获胜次数
    this.loose = 0 // 失败次数
    this.count = 0 // 已进行次数
    this.change = change // 是否改变当前选择
    this.N = N // 预计实验次数
    this.consoleInterval = consoleInterval // 每打多少个点打印一次PI
  }

  // 开启一场比赛
  [_run]() {
    let lottery =  Math.ceil(Math.random() * 3)
    let player = Math.ceil(Math.random() * 3)
    if (player === lottery) {
      this.change ? this.loose++ : this.win++
    } else {
      this.change ? this.win++ : this.loose++
    }
    this.count++
  }

  // 计算概率
  [_calcRate]() {
    return (this.win / this.count * 100).toFixed(2) + '%'
  }

  // 获取并打印rate
  getRate() {
    for (let i = 1; i < this.N + 1; i++) {
      this[_run]()
      if (i % this.consoleInterval === 0) {
        console.log(this.win, i, 'rate', this[_calcRate]())
      }
    }
  }
}

// 实例化MontyHall 获取Rate值
new MontyHall().getRate()
打印结果
consoleRate

从打印结果可以看出如果换门 胜率基本稳定在2/3

总结

当遇到一些没有固定规律可循的问题时,个人觉得这种暴力模拟的方法不失为一种好方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272