从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
相关文章推荐
- 随机等概率的输出m个不重复的数
- 10,随机等概率的输出m个不重复的数
- 从0到n-1中随机等概率输出m个不重复的数
- C#中怎样随机输出从0到100的数字且不重复(不用数组)
- 随机输出无重复字符的二维矩阵
- 随机给定10个小于10的数字(出现的数字可能重复),从其中取出3个各不相同的数字可组合出多个不同的3位数,请输出这些3位数中最大的那个3位数
- 产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。按照数组下标输出结果。
- [迅雷笔试题]从1....n中随机输出m个不重复的数
- 福彩双色球中红球由6个1-33之间的数字组合,且不重复,编写代码,使用Set集合来存储随机生成的1-33的数字,然后输出生成的数字
- 编程珠玑: 12章 取样问题 12.1程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复-------解题总结
- 编程珠玑: 12章 取样问题 12.1程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 优化解法-------解题总结
- 等概率随机生成不重复的数
- 编程珠玑: 12章 取样问题 12.3设计空间,程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 -------解题总结
- 编程珠玑: 12章 取样问题 12.3设计空间,程序的输入包含两个整数m和n,其中m<n。输出是0~n-1范围内m个随机整数的有序列表,不允许重复。 解法2-------解题总结
- java不重复的随机输出数组中的全部数据(做更新)
- 随机给定10个小于10的数字(出现的数字可能重复),从其中取出3个各不相同的数字可组合出多个不同的3位数,请输出这些3位数中最大的那个3位数
- 从1....n中随机输出m个不重复的数
- 从1....n中随机输出m个不重复的数
- 编程产生一个int数组,长度为30,并向其中随机插入1-30,并且不能重复输出数组。实现一个冒泡排序算法对其进行排序,输出排序结果
- [转载]C语言随机输出1~20不重复的随机数