古詩詞大全網 - 藝術簽名 - 如何設計等概率的隨機函數

如何設計等概率的隨機函數

Knuth Shuffle的洗牌算法,算法復雜度O(n),洗牌的目的是產生壹串等概率的隨機列。

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>