1. 程式人生 > >陣列隨機打亂洗牌排序

陣列隨機打亂洗牌排序

  • 有人會問,那第一種演算法為什麼就錯了呢?看它的樣子多麼對稱美觀啊……且慢,我還沒說第一種演算法是錯的哦!雖然第一種演算法將產生比第二種演算法更多的可能性,會導致一些重複的數列,但完全有可能每種數列重複了相同的次數,概率仍然是均等的。事實上,更有可能發生的是,這兩種演算法都是正確的,不過相比之下呢第一種演算法顯得更加對稱美觀一些。為此,我們需要說明,第一種演算法產生的所有情況均等地分成了n!個等價的結果。顯然,這個演算法將會產生n^n種情況,而我們的排列一共有n!個,因此n^n必須能夠被n!整除才行(否則就不能均等地分佈了)。但是,n!裡含有所有不超過n的質數,而n^n裡卻只有n的那幾個質因子。這表明要想n^n能被n!整除,n的質因子中必須含有所有不超過n的質數。這個結論看上去相當荒唐,反例遍地都是,並且直覺上告訴我們對於所有大於2的n這都是不成立的。為了證明這一點,只需要注意到2是質數,並且根據Bertrand-Chebyshev定理,在n/2和n之間一定還有一個質數。這兩個質數的乘積已經大於n了。搞了半天,第一種看似對稱而美觀的演算法居然是錯的!