1)如何保證等概率:從r個剩余的元素中選擇s個元素,那麽下壹個元素選中的概率為s/r。
2)假設函數bigrand()返回壹個大的隨機整數(比m和n個大很多),那麽bigrand()%n返回[0,n-1]範圍的隨機整數
4)應用:其他應用如從n個城市中選擇出m個城市的名字,可以先對城市名進行簽名標記為0,1,...,n-1
記住:我們面對的隨機函數的輸入是0,1,...,n-1,具體應用可以運用簽名轉換成成對應的0,1,...,n-1
5)如果要按序輸出,可以先對操作對象排序,然後簽名[0,n-1],這樣通過按序訪問數,就能保證輸出結果是有序的
[java]
<span style="font-size:18px">//重新排列[0,n-1]範圍內的數
public int[] knuthShuffle(int[] arr) {
if(arr==null)
return arr;
int randValue;
for (int remaining=arr.length; remaining>=0; remaining--) {
randValue = bigrand()%remaining; //產生[0,remaining-1]範圍內的隨機數
swap(array[remaining], array[randValue]);
} //end for
return arr;
} //end knuthShuffle</span>
從n個數中隨機選擇m個數,其中[0,1,...,n-1]代表數的簽名
[java]
<span style="font-size:18px">public void genknuth(int m,int n){
//輸入控制
if(m<=0 || n<=0 || m>n)
return ;
int select=m; //選擇m個元素
int remaining=n; //剩余n個元素
int randValue;
for(int i=0;i<n;i++){
randValue=bigrand()%(remaining-i);
if( randValue<select ){
System.out.println(i);
select--;
}//end if
}//end for
}//end genknuth()</span>