蒙特卡羅 隨機化演算法

2022-03-23 04:38:19 字數 1219 閱讀 1931

蒙特卡羅(monte carlo)方法是一種以概率統計為指導思想的方法,通過使用隨機數來解決許多問題。

基本思想:

當所求解問題時是一種隨機事件,或者是某個隨機變數的數學期望時,我們通過統計隨機事件出現的頻率,或者得到隨機變數的數字特徵,來得到問題的解。在實際應用中,不論採用確定性演算法,還是隨機化演算法,都無法保證每次都得到正確的解答。

蒙特卡羅演算法取樣越多,越接近最優解;(強調每一次隨機都在進步,提高的過程);

拉斯維加斯演算法取樣越多,越有可能找到最優解;(強調直接想要最優解)

1.主元素問題

設t[n]是有n個元素的陣列,其實如果x出現的概率p(x)>1/2,則稱x為陣列t的主元素,現在給了一組數t=。求t的主元素。

如果使用蠻力法,依次將所有的數做比較,需要比較n*(n-1)/2次,時間複雜度為0(n^2);

蒙特卡羅方法,先隨機抽取乙個數x,與其他數做比較,主元素出現所佔陣列總數的概率大於二分之一,所以這個數是主元素的概率p(x)>1/2,隨著抽取數的次數增多,越來越確定主元素是誰,逼近最優解。

1

//隨機化演算法 蒙特卡羅演算法 主元素問題

2 #include "

stdafx.h

"3 #include "

randomnumber.h

"4 #include 5 #include 6

using

namespace

std;78

//判定主元素的蒙特卡羅演算法

9 template

10bool majority(type *t,int

n)1124}

2526

return (k>n/2); //

k>n/2時,t含有主元素27}

2829

//重複k次呼叫演算法majority

30 template

31bool majoritymc(type *t,int n,double

e)3240}

41return

false;42

}4344int

main()45;

49 cout<<"

陣列a的元素如下:

"<50for(int i=0; i<10; i++)

5154 cout<55 cout<<"

呼叫majoritymc判斷陣列是否含有主元素結果是:

"56 }

隨機化演算法

隨機化演算法的主要目的是希望讓隨機發生在演算法上,而不是發生在輸入分布上,這樣的話,沒有特別的輸入會引起我們的演算法的最壞情況。即使你最壞的敵人也無法產生最壞的輸入陣列。因為隨機排列使得輸入次序不再相關。只有在隨機數生成器產生乙個不走運的排列時,隨機演算法才會執行得很差。一.隨機優先順序陣列法 我們...

隨機演算法 蒙特卡羅演算法

那麼我們可以理解為,隨機選取一些離散點集合,保證以一定的概率求出近似於 值的最優解,高等數學中求近似解,往往是極限時,為任意小的常數且不為0 這裡提到了根據蒙特卡羅演算法原理,演算法經過多次執行可以得到近似於 的最優解。蒙特卡羅monte carlo 又稱隨機抽樣或統計試驗方法,是以概率和統計理論方...

隨機化演算法基礎

隨機化演算法在分析某些涉及概率分析的問題上具有重要意義,因為輸入的分布是我們不能預知的,我們想讓分析的問題達到乙個平均的狀態,就得依靠隨機化,把輸入分布重新排列,使之成為乙個脫離其他外界因數的排列,同時要保證出現這個排列的概率為1 n 下面,有兩個常用的演算法來實現輸入分布的隨機化,以給定的輸入陣列...