您的位置:首页 > 其它

从0到n-1中随机等概率输出m个不重复的数

2017-08-31 22:25 633 查看

题目描述

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

转自:http://blog.csdn.net/u010296036/article/details/70036924
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐