今天看到一段代码,可以从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 99
2 v2 = rand() % 100 + 1; // v2 in the range 1 to 100
3 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个值后就停止循环。
原文:http://www.cnblogs.com/letgo/p/5829251.html