乙個重新排列的演算法,如何計算每種排列的概率?

時間 2021-05-30 08:10:58

1樓:Ryan Lee

貼兩個老鏈結,雖然提的這個問題是原問題的子問題,但分析裡也解釋的很清楚了。

2樓:sniperelite

一種方法當然是首先弄乙個數池,池中有1~n的數字,然後每次以等概率選出乙個並從池中移除。

另外MATLAB的randperm提供了乙個巧妙的思路:隨機產生n個均勻分布的隨機數,並且依次給每個數賦以1~n的序號,然後對齊進行排序,排序後的序號序列就是乙個隨機排列。當然,這樣做是否是嚴格等概率的倒是沒細究過,不過直覺上很符合隨機排列序列的需要,儘管在概率統計中「直覺」很不靠譜……

3樓:白如冰

講道理,這個演算法是有問題的。

這個演算法流程中,共呼叫了次隨機數生成,每次隨機數的選擇範圍是到,也就是說,程式實際執行過程會有種可能的情況分支。

而箇元素的全排列是種,如果不能整除就意味著生成的排列不是等概率的。

換言之,這個演算法的實際流程就像乙個深度為的叉樹從根到葉子結點的路徑,葉子結點有個。可能會有多個葉子結點對應同一種全排列,如果演算法正確,根據對稱性,每種全排列對應的葉子結點數應該是一樣多的。如果如果不能整除,那麼演算法就有問題。

正確的做法是

int randomIndex = Random.Range(i, deck.Length);

如何從乙個計算機小白開始給自己的電腦重新裝系統?

即刻 上網閒逛,看看別人怎麼裝的,等到有一天突然想試一把,就把自己電腦有用資料都備份都行動硬碟,然後隨便折騰吧,折騰完自己電腦就會有人找你這個他們的電腦,不同品牌的電腦一些區別,有些會有限制,折騰幾台就差不多了。 亞歷山魈 計算機小白的話,最起碼得應該得會打字吧browser裡面查一下,教程一大片啊...

作為乙個演算法小白如何學習演算法?如何在有限的時間內快速提公升自己的演算法能力?

已登出 刷題就要耐得住性子,不要只追求數量。從簡單題目開始,逐漸增加難度。拿到題目先自行思考,如果乙個小時左右沒有思路就看解答,不要硬想,參照解答去思考自己的卡點在哪,是哪部分掌握的不好,結合書籍把知識點補牢。刷題可以按照類目,不同的題目可能是考的乙個知識點的不同方面,有的知識點能夠從多個方面考察,...

求助乙個排列組合的問題?

王箏 用了另外乙個演算法。首先看分母,是所有連線的方法,每一步取出兩個繩頭連起來,所以是C 2 12乘到C 2 2,但是注意到與順序無關,所以要除掉6 所以算出來是11 然後分子是6個東西連成一圈的種類數,首先全排列成6 但是起點是任意的,要除掉6,然後正反兩面是任意的,要除掉2,每個繩子有兩種方向...