下面的程序可以从0....n-1中随机等概率的输出m个不重复的数。这里我们假设n远大于m
knuth(int n, int m) { srand((unsigned int)time(0)); for (int i = 0; i < n; i++) { if ( ) { cout << i << endl; ( ); } } }
#include <iostream> #include<ctime> #include<cstdlib> using namespace std; void knuth(int n, int m) { srand((unsigned int)time(0)); for (int i = 0; i < n; i++) { //rand() % (n-i)通过对(n-i)取模,获得了一个从n-i的随机数,就是说 //如果i=0;就是随机产生1到n的数,与m作比较是限制在m个数据中不会 //有相同的数重复出现,同时确保等概率性 if ( rand() % (n-i) < m) { cout << i << endl; m--; } } } int main() { //本题一个比较关键的条件是n远远大于m,这样满足这个条件才能确保 //每次都会得到m个数据 knuth(10000000,5); system("pause"); return 0; }
rand()%(n-i)是个随机数,m=0时不会在打印数据。所以实际打印的个数是1~m时打印,即m个,取小于号。若取等,m=0的时候,还会再打印一个数。