📄 mathpi.htm
字号:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<link rel="stylesheet" href="css/stdlayout.css" type="text/css">
<link rel="stylesheet" href="css/print.css" type="text/css">
<meta content="text/html; charset=gb2312" http-equiv="content-type">
<title>蒙地卡罗法求 PI</title>
</head>
<body>
<h3><a href="http://caterpillar.onlyfun.net/GossipCN/index.html">From
Gossip@caterpillar</a></h3>
<h1><a href="AlgorithmGossip.htm">Algorithm Gossip: 蒙地卡罗法求 PI</a></h1>
<h2> 说明</h2>
蒙地卡罗为摩洛哥王国之首都,该国位于法国与义大利国境,以赌博闻名。蒙地卡罗的基本原理为以乱数配合面积公式来进行解题,这种以机率来解题的方式带有赌博的意味,虽然在精确度上有所疑虑,但其解题的思考方向却是个值得学习的方式。<br>
<h2>解法</h2>
蒙地卡罗的解法适用于与面积有关的题目,例如求PI值或椭圆面积,这边介绍如何求PI值;假设有一个圆半径为1,所以四分之一圆面积就为PI,而包括此四分之一圆的正方形面积就为1,如下图所示: <br>
<div style="text-align: center;"><img style="width: 352px; height: 170px;" alt="蒙地卡罗" title="蒙地卡罗" src="images/mathPI-1.jpg"></div>
<br>
如果随意的在正方形中投射飞标(点)好了,则这些飞标(点)有些会落于四分之一圆内,假设所投射的飞标(点)有n点,在圆内的飞标(点)有c点,则依比例来算,就会得到上图中最后的公式。<br>
<br>
至于如何判断所产生的点落于圆内,很简单,令乱数产生X与Y两个数值,如果X^2+Y^2等于1就是落在圆内。 <br>
<h2> 实作</h2>
<ul>
<li> C
</li>
</ul>
<pre>#include <stdio.h> <br>#include <stdlib.h> <br>#include <time.h> <br><br>#define N 50000 <br><br>int main(void) { <br> int i, sum = 0; <br> double x, y; <br><br> srand(time(NULL)); <br><br> for(i = 1; i < N; i++) { <br> x = (double) rand() / RAND_MAX; <br> y = (double) rand() / RAND_MAX; <br> if((x * x + y * y) < 1) <br> sum++; <br> } <br><br> printf("PI = %f\n", (double) 4 * sum / N); <br><br> return 0; <br>} <br></pre>
<br>
<ul>
<li> Java
</li>
</ul>
<pre>public class PI {<br> public static void main(String[] args) {<br> final int N = 50000;<br> int sum = 0; <br><br> for(int i = 1; i < N; i++) { <br> double x = Math.random(); <br> double y = Math.random(); <br> if((x * x + y * y) < 1) <br> sum++; <br> } <br><br> System.out.println("PI = " + (double) 4 * sum / N); <br> }<br>}</pre>
<br>
<br>
</body>
</html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -