機率算法依照機率統計的思路來求解問題,每每不能獲得問題的精確解,但卻在數值計算物生獲得了普遍的應用。由於不少數學問題,每每沒有或者很難計算解析解,這時便須要經過數值計算來求解近似值。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)算法。
蒙特卡羅算法的一個典型應用:計算圓周率π。
使用蒙特卡羅計算圓周率有以下兩個關鍵點:
均勻撒點->用隨機函數實現;
區域 判斷->經過計算判斷:
公式以下:
#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的精確度不一樣,結果也是不一樣的;