随机生成0到n之间的m个数

分析:使用knuth算法:

void PutRand(int n,int m) { srand(time(NULL)); for (int i=0;i<n;i++) { if(rand()%(n-i)<m) { cout<<i<<endl; m–; } } }

证明:

1、当i=0时,则生成的随机数是0,1,2…n-1之间的数,共n个;这是0被选到的概率为m/n。

2、当i=1时,生成的随机数是0,1,2…n-2之间的数,共n-1个;假设上次0被选到,那么这次1被选中的概率为(m-1)/(n-1),,假设上次0没有被选到,那么这次1选到的概率为m/(n-1)。因此这次1被选中的概率为[m/n]*[(m-1)/(n-1)]+[(1-m/n)]*[m/(n-1)]=[m*(m-1)]/[n*(n-1)]+[(n-m)/n]*[m*(n-1)]=(m^2-m)/[n*(n-1)]+(n*m-m^2)/[n*(n-1)]=(n*m-m)/[n*(n-1)]=m/n。和第一次的概率相同。

3、可得,第i次产生i的概也为m/n,符合题意。

其他方法略。

你写PPT时,阿拉斯加的鳕鱼正跃出水面,

随机生成0到n之间的m个数

相关文章:

你感兴趣的文章:

标签云: