分析:使用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,符合题意。
其他方法略。
时间: 2024-10-29 19:08:09