2012-11-24 27 views
4

我有整數1,2,3,...,n,從中我必須隨機挑選n個不同的整數。我打算將這些整數放入一個數組中,然後使用Fisher Yates Shuffle:Fisher-Yates隨機播放:如果在m次後停止,是隨機的?

隨機選取數組中的一個條目。用最後一個條目交換它。然後,隨機選取數組中除最後一個條目外的條目。將此與第二個最後一個條目交換。重複直到最後的m個條目以這種方式獲得。

問題

我的理解是,如果一直持續到n次,每一個可能的安排是同樣可能與此洗牌。所以,如果在n次之後停止,最後m個條目的每一個排列都是相同的可能性。因此,最後的m個條目是我需要的m個隨機獨立整數。

我的理解是否正確?

+1

是。 (這個答案比發佈評論的長度要求更短....) –

+1

你剛剛重新創造了[油藏採樣](http://en.wikipedia.org/wiki/Reservoir_sampling)。 – finnw

+0

@finnw - 尼斯鏈接。感謝您指出。 +1 – Legendre

回答

3

是的,也許更容易往前走:

讓範圍rand(z)回報[0..z)

for (int i = 0; i < m; i++) 
    swap(X[i], X[i+rand(n-i)]) 

X[0..m-1]現在是隨機抽樣

+0

感謝您改善我的代碼! +1 – Legendre