从0....n-1中随机等概率的输出m个不重复的数。这里我们假设n远大于m

下面的程序可以从0....n-1中随机等概率的输出m个不重复的数。这里我们假设n远大于m
1
2
3
4
5
6
7
8
9
10
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-- ;
         }
      }
}

解释如下:

   对于从0到n-1 个数字想要等概率输出,说明每个数字出现的概率为m/n

  对于i=0,rand()%(n-0) <m 的概率为 m/ n;

 对于任意的i ,rand()/n-i <m 的概率都是 m/n;

以下以i=1 举例:

假如 i= 0 输出了,概率为m/n,此时 m 变成m-1;rand() %(n-1) <m 的概率变成m-1/n-1 

假如i=0 没有输出,概率为n-m/n    rand()%(n-1)<m 的概率为m/n-1

通过概率公式可以算出来概率是m/n。

后面道理是一样的。



猜你喜欢

转载自blog.csdn.net/zwz2011303359/article/details/80871122