C语言随机函数怎样产生0-9互不相同的10个随机数

程序如下:
#include "stdio.h"
#include "stdlib.h"

main()
{
int a[10],i,j;
srand((unsigned)time(NULL));
for(i=0;i<10;i++)
{a[i]=rand()%10;
for(j=0;j<i;j++)
{if((i!=0)&&(a[i]==a[j]))
{ a[i]=rand()%10;
j=0;
}
}
}
printf("the num is:");
for(i=0;i<10;i++)
printf("\n%d\n",a[i]);

}
结果有时候有重复数字出现,请高手帮帮小弟!

对已经获取到的随机数做标记,如果已经获取到过,那么则放弃该随机数,并继续获取。

直到获取到所有随机数为止。

参考代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

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;
}
温馨提示:答案为网友推荐,仅供参考
第1个回答  2008-06-12
循环重写下,关键是你找到重复后重新生成的时候没有重新判定。
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;
}
第2个回答  2008-06-12
srand((unsigned)time(0));
以系统时间为种子这样每次产生的书就是随机数,否则产生伪随机数
第3个回答  2008-06-12
#include<stdio.h>
#include<stdlib.h>
#include<time.h>

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;

}
}
}本回答被提问者采纳
相似回答