对已经获取到的随机数做标记,如果已经获取到过,那么则放弃该随机数,并继续获取。
直到获取到所有随机数为止。
参考代码如下:
#include
#include
#include
int main()
{
int a[10];//存储获取到的随机数。
int f[10] = {0};//存储是否获取到过。
int n = 0; //计数器。
srand(time(NULL));//设置随机数种子。
while(n<10)
{
int m = rand()%10; //获取一个0~9的随机数。
if(f[m]) continue;//该数之前已经获取到过。
a[n++] = m;//将该数存入数组。
f[m] = 1;//标记该数已经获取过。
}
for(n = 0; n < 10; n++)//打印结果。
printf("%d,",a[n]);
return 0;
}
循环重写下,关键是你找到重复后重新生成的时候没有重新判定。
for(i = 0; i < 10; ++i)
{
a[i] = rand()%10;
for(j = 0; j < i; ++j)
{
if( a[i] == a[j])
{
a[i] = rand()%10;
j = -1;
}
}
}
不过不停这么判定的话效率很低的。
可以建立一个数组b[10] = {0,1,2,3,4,5,6,7,8,9};
大致如下
int bLength = 10, index = 0;
for(i = 0; i < 10; ++i)
{
index = rand()%bLength;//防止出错的话应该对index值进行判定,这里就略去了
a[i] = b[index];
b[index] = b[bLength-1])
--bLength;
}
srand((unsigned)time(0));
以系统时间为种子这样每次产生的书就是随机数,否则产生伪随机数
#include
#include
#include
main()
{
int a[10];
int b[10];
int i,index,x=0;
for(i=0;i<10;i++)
a[i]=i+1;
srand((unsigned)time(0));
for(i=0;i<10;)
{
index=rand()%10;
if(a[index]!=0)
{
b[i]=a[index];
printf("%d\n",b[i]);
a[index]=0;
++i;
}
}
}