1. 程式人生 > >從0到n-1中隨機等概率輸出m個不重複的數

從0到n-1中隨機等概率輸出m個不重複的數

題目描述

假設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。