比如要取小于100的不重复随机数 用rand()%100 的范围是 0--99,但是中间可能会重复,就是加上srand(time(NULL)),也不行,必须要加上一数组来判断才行。
公司用的算法是把用过的随机数做个标记,假如后面用得一样就加大直到不一样。
char Rnd_Rec[100] = {0}; //数组来标记有没有用过
srand((int) time(NULL)); //改变种子
tmp = rand() % 100; //限定范围
if(tmp >= 100)
{
return tmp;
}
//循环判断有没有用过,用过就标记上以后不用。
while(Rnd_Rec[tmp])
{
tmp++;
if(tmp == 100)
{
tmp = 0;
}
}
Rnd_Rec[tmp]++;
分析算法发现,每次的运算时间都不一样。还是下面这个算法比较好
{
int *pPool = NULL;
int i;
if (size >= 0) {
if ((pPool = malloc (sizeof(int) * (size + 1))) == NULL)
return NULL;
pPool[0] = size;
for (i = 0; i < size; i++) {
pPool[i+1] = i;
}
}
//随机的种子
srand (time(NULL));
}
int randunique(int size,int *pPool) {
int i,n;
int irand ;
n = rand() % pPool[0];
irand = pPool[n+1];
pPool[n+1] = pPool[pPool[0]];
pPool[0]--;
//超过了size次数重新随机 ,总的随机个数为RAND_MAX=0x7fff 或者0x7fffffff不用每次都修改种子
if (pPool[0] == 0) {
pPool[0] = size;
for (i = 0; i < size; i++) {
pPool[i+1] = i;
}
}
return irand;
}
void randunique_close(int *pPool)
{
if (pPool!=NULL)
{
free(pPool);
}
}
//测试
int * pPool = randunique_init (20);//小于20的随机数
int i = 100;
// 遍历20次内不同,超过20次就在20内部循环
while (i-- >= 0) {
printf (" %d\n",randunique(20, pPool));
}
//结束要释放内存
randunique_close(pPool);
可以看到前20个数都是不重复的随机数,每20个一个循环,循环的次序也不同。也可以把pPool作为全剧变量的数组,这样一个函数就搞定了。