随机等概率的输出m个不重复的数
来源:互联网 发布:创盈门窗软件 编辑:程序博客网 时间:2024/05/16 06:03
今天看到一段代码,可以从0.....n-1中随机等概率的输出m个不重复的数(n远远大于m)。遂记录下来。
首先,产生随机数,不免要用到srand,rand函数。先简单介绍下两个函数。
1,void srand(unsigned int seed);
初始化随机数生成器,对于每一个不同的seed,每一次调用rand()将会产生不同的随机数序列。
特别的,当seed == 1时,生成器将会被重新初始化以前的初始化值,那么下次rand产生的随机数将会和第一次rand()相同。
所以,为了产生真正的随机数,srand()一般用time(0)来初始化seed。
2, int rand(void)
产生一个0~RAND_MAX的随机数,而产生随机数的算法依赖种子seed。如果要产生一个特点区间的随机数,则可以用modulo的方法
1 v1 = rand() % 100; // v1 in the range 0 to 992 v2 = rand() % 100 + 1; // v2 in the range 1 to 1003 v3 = rand() % 30 + 1985; // v3 in the range 1985-2014
3,等概率产生随机数的方法
先上代码。
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,可知,输出m个不同值的要求已满足,因为每次输出的都是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个数,若i=0没有被输出,则m--未被执行,此时i=1被输出的概率为m/(n-1),若i=0已经被输出了,则m变为m-1,此时i=1被输出的概率为(m-1)/(n-1);由概率论的知识,可知此时i=1被输出的概率为
P=(1-m/n)*(m/(n-1))+m/n*((m-1)/(n-1))=m/n;以此类推,可知每个数被输出的概率都为m/n
阅读全文
0 0
- 随机等概率的输出m个不重复的数
- 从0到n-1中随机等概率输出m个不重复的数
- 从0到n-1中随机等概率输出m个不重复的数
- 下面的程序可以从0....n-1中随机等概率的输出m个不重复的数。(假设n>>m)
- 等概率随机生成不重复的数
- [迅雷笔试题]从1....n中随机输出m个不重复的数
- 从1....n中随机输出m个不重复的数
- 从1....n中随机输出m个不重复的数
- 从一整数数组中等概率抽取m个不重复的数
- 从n中取出m个不重复的数
- 随机生成给定范围内N个不重复的数
- 【算法导论学习-012】n个数随机等概率的抽样m个
- 给定等概率随机产生1~M的随机函数, 实现等概率随机产生1~N的随机函数
- m个元素的数组,随机选择n个不重复元素(js实现)
- 随机产生不重复的一组数
- 生成随机不重复的数
- 在[1,n]中随机取m个无重复数的Bob Floyd算法
- 产生n个小于等于m的不重复随机整数
- RTTI学习及四个实现方法
- 不认识String、StringBuffer和StringBuilder这三兄弟的同学赶紧进来
- 学习笔记32-设计模式
- Django(二)--初相见
- openjudge 开餐馆(动态规划)
- 随机等概率的输出m个不重复的数
- Android -List<T>和ArrayList<T>(),发现你的真身
- 4.tomcat虚拟目录的配置
- 日记(周末)
- 常见ASCII码
- JS正则表达式大全(整理详细且实用)
- 简单侧滑
- 希尔排序
- 虚拟化技术的用处