起源
[1946: John von Neumann, Stan Ulam, and Nick Metropolis, all at the Los Alamos Scientific Laboratory, cook up the Metropolis algorithm, also known as the Monte Carlo method.]1946年,美国拉斯阿莫斯国家实验室的三位科学家John von Neumann,Stan Ulam 和 Nick Metropolis共同发明,被称为蒙特卡洛方法。它的具体定义是:在广场上画一个边长一米的正方形,在正方形内部随意用粉笔画一个不规则的形状,现在要计算这个不规则图形的面积,怎么计算列?蒙特卡洛(Monte Carlo)方法告诉我们,均匀的向该正方形内撒N(N 是一个很大的自然数)个黄豆,随后数数有多少个黄豆在这个不规则几何形状内部,比如说有M个,那么,这个奇怪形状的面积便近似于M/N,N越大,算出来的值便越精确。在这里我们要假定豆子都在一个平面上,相互之间没有重叠。(撒黄豆只是一个比喻。)
特点
蒙特卡洛方法的伟大之处,在于对精确性问题无法解决的时候,利用“模拟”的思想来求解。 在各个领域得以应用。本质是模拟(simulation): 利用大量随机输入,产生各种输出;结果的概率分布就是真实分布的“近似”。所以,输入的分布是否随机(目前计算机所能做的就是伪随机,并不能产生真正的随机分布),这个过程我们成为Sampling Random Variables。
计算圆周率近似值代码:
package com.xu.main; import java.util.Scanner; public class P9_1 { static double MontePI(int n) { double PI; double x, y; int i, sum; sum = 0; for (i = 1; i < n; i++) { x = Math.random(); y = Math.random(); if ((x * x + y * y) <= 1) { sum++; } } PI = 4.0 * sum / n; return PI; } public static void main(String[] args) { int n; double PI; System.out.println("蒙特卡洛概率算法计算圆周率:"); Scanner input = new Scanner(System.in); System.out.println("输入点的数量:"); n = input.nextInt(); PI = MontePI(n); System.out.println("PI="+PI); } }
输出:
蒙特卡洛概率算法计算圆周率: 输入点的数量: 9999999 PI=3.1417975141797516
总结
以上就是本文关于蒙特卡洛算法起源及特点的简介,还有如何利用这种算法思路在Java编程中求圆周率的近似值实例,希望对大家有所帮助。喜欢的朋友请继续关注小牛知识库!
1 前言 在上一篇文章中,我们介绍了基于Bellman方程而得到的Policy Iteration和Value Iteration两种基本的算法,但是这两种算法实际上很难直接应用,原因在于依然是偏于理想化的两个算法,需要知道状态转移概率,也需要遍历所有的状态。对于遍历状态这个事,我们当然可以不用做到完全遍历,而只需要尽可能的通过探索来遍及各种状态即可。而对于状态转移概率,也就是依赖于模型Model
本文向大家介绍Java使用Math.random()结合蒙特卡洛方法计算pi值示例,包括了Java使用Math.random()结合蒙特卡洛方法计算pi值示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Java使用Math.random()结合蒙特卡洛方法计算pi值。分享给大家供大家参考,具体如下: 一、概述 蒙特·卡罗方法(Monte Carlo method),也称统计模拟方法,是
个人觉得,整个 AplphaGo 对于机器学习来说,最核心的算法就是深度学习(Deep Learning)和增强学习(Reinforcement Learning)。蒙特卡洛树搜索 MCTS 是一个搜索框架,将这些机器学习的技术融合在了一起。今天这篇文章的重点在深度学习,增强学习以后再说。 蒙特卡洛树搜索 每个博弈类的人工智能算法的基础都是一个搜索算法。比如我们上学时学习的 A-star 算法,a
这是我的代码: 由于某种原因,与可接受值相比,这段代码只产生了小数15位的pi值。我试图通过增加精度值来解决这一点;这增加了位数,但只有前15个仍然是准确的。我试着改变它计算算法的方式,它也不起作用。所以我的问题是,是否可以对这段代码做些什么来使它更加精确,或者我必须使用另一种算法?我将非常感谢对此的帮助,因为我不知道如何在Python中使用这么多的数字进行操作。我希望能够控制程序确定和显示的(正
我试着用蒙特卡罗模拟方法来计算一个事件发生的概率,在一个连续三次的10个事件列表中。我将进行100万次试验。事件发生的概率在任何时候都是31.43%。我的想法是,我将调用任何试验(b),并创建一个嵌套循环,因此如果条件一(rand值小于.3143),我将移动到索引中的下一个数字,如果该数字小于.3143,我将移动到下一个数字。如果发生这种情况,我会给火鸡加1。当100万次试验完成后,我将turke