蒙特卡罗类型概率算法
生活随笔
收集整理的這篇文章主要介紹了
蒙特卡罗类型概率算法
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
蒙特卡羅類型概率算法
蒙特卡羅算法:用蒙特卡羅算法能夠求得問(wèn)題的一個(gè)解,但是這個(gè)解未必是正確的。求得正確解的概率依賴于算法所用的時(shí)間。算法所用的時(shí)間越多,得到正確解的概率就越高。蒙特卡羅算法的主要缺點(diǎn)就在于此。一般情況下,無(wú)法有效判斷得到的解是否肯定正確。其特點(diǎn)是判定問(wèn)題的準(zhǔn)確解,得到的解不一定正確。
【問(wèn)題】設(shè)計(jì)一個(gè)求(圓周率)的蒙特卡羅型概率算法。
【解答】在邊長(zhǎng)為2的正方形內(nèi)有一半徑為1的內(nèi)切圓,如圖所示。向該正方形中投擲n次飛鏢,假設(shè)飛鏢擊中正方形中任何位置的概率相同,設(shè)飛鏢的位置為(x,y),如果有+1,則飛鏢落在內(nèi)切圓中。
? ? ? ?這里內(nèi)切圓面積為,正方形面積為4,內(nèi)切圓面積與正方形面積比為/4。若n次投擲中有m次落在內(nèi)切圓中,則內(nèi)切圓面積與正方形面積之比可近似為m/n,即/4m/n,或者4m/n。
? ? ? 由于圖中每個(gè)象限的概率相同,這里以右上角象限進(jì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() { //產(chǎn)生一個(gè)[0,1]的隨機(jī)數(shù)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));//隨機(jī)種子cout <<"π="<<solve()<< endl;system("pause"); }選擇出現(xiàn)頻率出現(xiàn)最高的即可。
?
總結(jié)
以上是生活随笔為你收集整理的蒙特卡罗类型概率算法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 解析游戏中的简单概率算法
- 下一篇: 最常用的GitHub—— Android