再次翻出演算法導論,隨機翻倒了隨機排列陣列這個部分,感覺數學是如此神奇!
首先,何謂隨機排列陣列。隨機排列陣列即通過排列給定的輸入陣列使陣列元素的排列隨機化,例如乙個陣列a[n],其中元素為的值為,那麼對陣列進行隨機排列,顯然是有n!次不同的排列,並且每一次的排列都不一樣。如何把陣列元素排列隨機化呢?
乙個常用的方法就是為陣列的每乙個元素a[i]賦乙個key,用來表示它的優先順序,即p[i],並且[i]是隨機的,然後根據這個優先順序對陣列中的元素進行排序。那麼最終的陣列即為乙個隨機排列陣列。還是舉個例子吧!
現在有陣列a={2,3,1,4},並且它的隨機優先順序p={3,2,6,8}.根據優先順序陣列p,p[2]輸入陣列a,長度為n:
for i=1 to n
生成隨機數組p中元素p[i];
把p[i]當作a[i]的鍵值對陣列a進行排序;
返回陣列a
注意:p[i]中元素必須唯一,否則出現不惟一的優先順序,也就不能夠保證均勻的隨機的陣列排序。解決方法是隨機生成p[i]不能僅僅選取[1,n]範圍內的隨機數,最好是[1,n^3]範圍內的隨機數。
還有乙個更好的辦法是不需要借助優先陣列,對陣列元素進行原地排列。具體的方法是:
對於i從1到n,從元素a[i]到a[n]中隨機選取乙個元素與a[i進行交換。
它的偽**為:
for i=1 to n
swap(a[i],a[random(i,n)];
返回陣列a
注意:這裡為什麼只需要交換a[i]與a[random]就行呢?可以稍微證明一下。首先a[i]與a[random]交換,a[i]的概率為1/(n-i+1),對i={1,2,...,n}而言,獲得乙個陣列排列的概率為1/(n-i+1)的乘積,即為1/n!。
小白高階之隨機排列陣列
在 演算法導論 的第五章講的是概率分析和隨機演算法,於是產生了現在的隨機排列陣列問題。隨機化有助於平衡輸入分布,進而有利於分析乙個演算法的平均情況行為。特意去看了一下c語言裡面產生隨機數的函式 雖然是偽隨機數 兩個基本函式為 int rand void void srand unsigned int...
隨機排列 隨機重排列和隨機抽樣
1 實現dataframe的隨機重排列 使用numpy.random.permutation函式可以實現對dataframe和series的隨機重排列。具體使用方法如下 生成乙個5行4列的dataframe,並且重新命名列名 data pd.dataframe np.arange 5 4 resha...
等概率隨機排列陣列(洗牌演算法)
又是一道跟概率相關的簡單問題。話說我的概率學的太差了,趁這個機會也從頭開始補習一下。問題描述 假設有乙個陣列,包含n個元素。現在要重新排列這些元素,要求每個元素被放到任何乙個位置的概率都相等 即1 n 並且直接在陣列上重排 in place 不要生成新的陣列。用o n 時間 o 1 輔助空間。演算法...