C++在较大范围内生成大量的无重复的随机数,算法是用标准C++语言写的,其思想主要是先用系统的int本身作为初始值,每次获得一个随机数以后更新其int区域对应的初始值,其更新的值是当前可以达到的最大的数字,同时在下一个随机数产生之前修改最大生成的值,即减一:即缩小范围替代随机法
#include<iostream> #include<vector> #include<map> #include<time.h> #include <algorithm> using namespace std; typedef vector<int> v_int; typedef map<int,int> int_int; v_int GetRandom(int min,int max,int total); int main() { v_int randoms = GetRandom(-100,100,180); v_int::iterator it; for(it=randoms.begin();it!=randoms.end();it++)//输出随机数 { cout<< *it<<endl;; } cout<<"....................................."<<endl; sort(randoms.begin(),randoms.end());//排序后输出,便于查看是否有重复的 //randoms for(it=randoms.begin();it!=randoms.end();it++) { cout<< *it<<endl;; } int i; cin>>i; return 0; } ///////////////////////////////////// //min:可以生成的最小的随机数(可以为负数) //max:可以生成的最大的随机数(可以为负数,但大于min) //total:一次调用生成的随机数的总数 //////////////////////////////////// v_int GetRandom(int min,int max,int total) { if(total>max-min) total = max - min; v_int result; int_int have; int i,j,k,n,s,m; s = max - min + 1; m = max - min; srand( (unsigned)time( NULL ) ); for(j=0; j<total; j++) { k=rand() % s; if(have.count(k) == 0) { n = k; } else { n = have[k]; } if(have.count(m) == 0) { have[k] = m; } else { have[k] = have[m]; } result.push_back(n+min); s--; m--; } return result; } |