從0到n-1中隨機等概率輸出m個不重複的數
阿新 • • 發佈:2019-02-20
題目描述
假設n遠大於m,程式設計實現從0到n-1中隨機等概率的輸出m個不重複的數。
void knuth(int n,int m)
{
srand((unsigned int)time(0));
for(int i = 0;i<n;i++)
{
if(rand()%(n-i)<m)
{
cout<<i<<endl;
m--;
}
}
}
思路解析
for迴圈執行了n次,每次輸出不同的i值,總共滿足條件的i值有m個,因此,m個不重複的數的要求已達到。
下面考慮如何等概率?
i=0時,rand()%(n-i)取值範圍為0-n-1,共計n個數,此時如果輸出0,只需要rand()%(n-i)小於m,因此,i=0被輸出的概率為m/n
i=1時,rand()%(n-i)取值範圍為0-n-2,共計n-1個數,此時如果0已經輸出了,則m已經自減,此時為m-1,則i=1被輸出的概率為(m-1)/(n-1);如果0沒有被輸出,則m未自減,此時,i=1被輸出的概率為m/(n-1)。此時,i=1被輸出的概率為(1-m/n)x(m/(n-1))+m/nx(m-1)/(n-1)=m/n。
依次類推,每個數被輸出的概率都是m/n。