算法中的機率算法基本思想

機率算法依照機率統計的思路來求解問題,每每不能獲得問題的精確解,但卻在數值計算物生獲得了普遍的應用。由於不少數學問題,每每沒有或者很難計算解析解,這時便須要經過數值計算來求解近似值。ios

機率算法基本思想算法

機率算法執行的基本過程以下:ide

(1)將問題轉化爲相應的幾何圖形s, S的面積是容易計算的,問題的結果每每對應幾何圖形中某一部分S1的面積。函數

(2)而後,向幾何圖形中隨機撒點。spa

(3)統計幾何圖形S和S1中的點數。根據S的面積和S1面積的關係以及各圖形中的點數來計算獲得結果。3d

(4)判斷上述結果是否在須要的精度以內,若是未達到精度則執行步驟 (2)。若是達到精度,則輸出近似結果。code

機率算法大體分爲以下4種形式。blog

數值機率算法。ci

蒙特卡羅(Monte Carlo)算法。數學

拉斯維加斯(Las Vegas) 算法。

舍伍德(Sherwood)算法。

蒙特卡羅算法的一個典型應用:計算圓周率π。

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

使用蒙特卡羅計算圓周率有以下兩個關鍵點:

均勻撒點->用隨機函數實現;

區域 判斷->經過計算判斷:

17fde28caaab16a4aa0e03d313213fd0.jpg

公式以下:

517619553a0c6aad701e23429f13f71e.jpg

#include<iostream>
#include<cstdlib>
#include<cmath>
using namespace std;
double MontePI(int n);
int main()
{
	int n;
	cout << "蒙特卡羅算法計算π" << endl;
	cout << "請輸入n的值(撒點次數(迭代次數)):" << endl;
	cin >> n;
	cout << "PI=" << MontePI(n) << endl;
	return 0;
}
double MontePI(int n)
{
	double x, y;
	int i, sum = 0;
	srand(time(NULL));
	for (i = 1; i < n; i++)
	{
		x = (double)rand() / RAND_MAX;//產生0~1之間的一個隨機數
		y = (double)rand() / RAND_MAX;
		if (pow(x, 2) + pow(y, 2) <= 1)
		{
			sum++;
		}
	}
	return (4.0 * sum / n);//計算π
}

 

隨着迭代次數不一樣,結果也不一樣;

下次別人問你PI等於多少的時候,你千萬不要說是3.14,或者3.1415926了,你應該說PI的精確度不一樣,結果也是不一樣的;

watermark,size_14,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_20,type_ZmFuZ3poZW5naGVpdGk=

相關文章
相關標籤/搜索