起源
[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。
计算圆周率近似值代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
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);
}
}
|
输出:
1
2
3
4
|
蒙特卡洛概率算法计算圆周率:
输入点的数量:
9999999
PI= 3.1417975141797516
|
总结
以上就是本文关于蒙特卡洛算法起源及特点的简介,还有如何利用这种算法思路在Java编程中求圆周率的近似值实例,希望对大家有所帮助。喜欢的朋友请继续关注服务器之家!
原文链接:http://blog.csdn.net/xuxian361/article/details/8130948