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;
}
本文来源:不详 作者:佚名