您的位置:首页 > 其它

无重复随机数的产生方法

2011-11-07 22:22 417 查看
无重复随机数的产生方法有很多,比较常见和容易理解的方法是

比如要产生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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: