无重复随机数的产生方法

无重复随机数的产生方法有很多,比较常见和容易理解的方法是

比如要产生11次0-10之间的无重复的随机数,可以先申请一个数组空间 INT a [11],初始化改数组的值全部为-1,然后不停的RAND随机数,如果a中相应的位置为-1,
那么把该位置的值置为该随机值,并打印输出,否则就继续RAND随机数,直到a[11]中无随机数为止
代码如下

	int k,i;
	int a[11];
	memset(a,0xFF,sizeof(a));
	for(k=0;k<11;k++)
	{
		i=rand()%11;
		while(1) 
		{	
			if(a[i] == -1)
			{
				printf("%d ",i);
				a[i]=i;
				break;
			}
			else
				i=rand()%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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值