先看良葛格的洗撲克牌(亂數排列)

以1~52的亂數排列為例好了,可以將陣列先依序由1到52填入,然後使用一個迴圈走訪陣列,並隨機產生1~52的亂數,將產生的亂數當作索引取出陣列值,並與目前陣列走訪到的值相交換,如此就不用擔心亂數重複的問題了,陣列走訪完畢後,所有的數字也就重新排列了。

簡言之
foreach $i (array){
$j = rand()
swap($i,$j)
}

但是這樣並不是正確的亂數排列方式,以大小為三的陣列為例,3! = 6,有六種排列變化方式,但是用這個方法得出的排列數卻是 3x3x3 = 27,而 27/6 無法整除,很明顯的不會平均分布,因此,用這種算法得到的排列並不是亂數排列。

真要做到亂數,迴圈數一樣是陣列大小,但是每 swap 一次,就要把一個元素剔除,再對剩下的陣列作重複的動作,這樣才是符合階層數的亂數排列。

這是一個很容易犯的小錯誤。