假设我们希望创建集合{1,2,3,...,n}的一个随机样本,即一个具有m个元素的集合S,其中
,使得每个m集合能够等可能的创建。一种方法是对i=1,2,...,n设A[i]=i,调用RANDOM-IN-PLACE(A),然后取最前面的m个数组元素。这种方法会对RANDOM过程调用n次。如果n比m大很多,我们能够创建一个随机样本,只对RANDOM调用更少的次数。请说明下面的递归过程返回{1,2,3...,n}的一个随机m子集S,其中每个m子集是等可能的,然而只对RANDOM调用m次。
RANDOM-SAMPLE(m,n) 1 if m==0 2 return3 else S=RANDOM-SAMPLE(m-1,n-1) 4 i = RANDOM(1,n) 5 if i
S 6 S=S
{n} 7 else S=S
{i} 8 return S RANDOMIZE-IN-PLACE(A) 1 n=A.length 2 for i=1 to n 3 swap A[i] with A[RANDOM(i,n)]
