无重复随机数的产生方法有很多,比较常见和容易理解的方法是
比如要产生11次0-10之间的无重复的随机数,可以先申请一个数组空间 INT a [11],初始化改数组的值全部为-1,然后不停的RAND随机数,如果a中相应的位置为-1,
那么把该位置的值置为该随机值,并打印输出,否则就继续RAND随机数,直到a[11]中无随机数为止
代码如下
比较好的一种高效算法采用的是置换法,仍就是先申请一个数组比如a[11],为a[11]按照其位置赋予相应的值,比如a[0] = 0.
rand()%11得到一个随机数b,此时b我们可以看做是a数组的下标,打印a[b] 并交换a[11] 与a[b],取随机数的范围减1即rand()%10,因为a[11]已经取到过了.
如此重复,该算法的算法复杂度是稳定的O(N)。
class rand_fyl //自己写的产生无重复随机数的类
{
public:
rand_fyl(int maxNum = 100)//默认返回0-100的无重复的随机数
{
p = new int [maxNum+1];
max = maxNum+1;
curPos = -1;
}
~rand_fyl(){
delete []p;
}
virtual void Initialize(void);
virtual int Rand(void);
protected:
int *p;
int max;
int curPos;
};
void rand_fyl::Initialize()//初始化,
{
for(int i = 0; i < max; i++)
p[i] = i;
curPos = max;
srand(time(0));
}
int rand_fyl::Rand(void)
{
if(curPos == 0)//此时所有随机数都已经产生完毕
return -1;
int t = rand()%curPos--;
int tmp;
tmp = p[t];
p[t] = p[curPos];
return tmp;
}