蒙特卡罗类型概率算法
生活随笔
收集整理的這篇文章主要介紹了
蒙特卡罗类型概率算法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
蒙特卡羅類型概率算法
蒙特卡羅算法:用蒙特卡羅算法能夠求得問題的一個解,但是這個解未必是正確的。求得正確解的概率依賴于算法所用的時間。算法所用的時間越多,得到正確解的概率就越高。蒙特卡羅算法的主要缺點就在于此。一般情況下,無法有效判斷得到的解是否肯定正確。其特點是判定問題的準確解,得到的解不一定正確。
【問題】設計一個求(圓周率)的蒙特卡羅型概率算法。
【解答】在邊長為2的正方形內有一半徑為1的內切圓,如圖所示。向該正方形中投擲n次飛鏢,假設飛鏢擊中正方形中任何位置的概率相同,設飛鏢的位置為(x,y),如果有+1,則飛鏢落在內切圓中。
? ? ? ?這里內切圓面積為,正方形面積為4,內切圓面積與正方形面積比為/4。若n次投擲中有m次落在內切圓中,則內切圓面積與正方形面積之比可近似為m/n,即/4m/n,或者4m/n。
? ? ? 由于圖中每個象限的概率相同,這里以右上角象限進行模擬。采用蒙特卡羅型概率算法求得程序如下:
#include <iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std;int randa(int a,int b) {return rand() % (b - a + 1) + a; } double rand01() { //產生一個[0,1]的隨機數return randa(0, 100)*1.0 / 100; }double solve() { //求π的蒙特卡羅算法int n = 10000;int m = 0;double x, y;for (int i = 0; i < n;i++) {x = rand01();y = rand01();if (x*x+y*y<=1.0) {m++;}}return 4.0*m / n;}void main() {srand((unsigned)time(NULL));//隨機種子cout <<"π="<<solve()<< endl;system("pause"); }選擇出現頻率出現最高的即可。
?
總結
以上是生活随笔為你收集整理的蒙特卡罗类型概率算法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 解析游戏中的简单概率算法
- 下一篇: 最常用的GitHub—— Android