#include<stdio.h>
#include<time.h>
void main(){
// 确认数组范围 :
int a_max,a_min,n;
printf("请输入这组随机数最大值:");
scanf("%d",&a_max);
printf("请输入这组随机数最小值:");
scanf("%d",&a_min);
n=a_max-a_min+1;
// 随机数生成代码:
int a[n],m,i,j; //m为中介变量
srand(time(NULL)); //使生成真正随机的数
a[0]=rand()%n+a_min;
for(i=1;i<n;i++){
while(1){
int s=0;
m=rand()%n+a_min;
for(j=0;j<i;j++){
if (m==a[j]) s=1; // 检查是否重复
}
if(s==0) break; //没有重复跳出循环
}
a[i]=m;
}
// 随机数输出代码:
for(i=0;i<n;i++){
printf("%d\n",a[i]);
}
}
效果如下
24年2月3日二编:
在我弟的指导下,改了个时间复杂度很低的版本,即使范围在6位数也能运行的很快,而上面写的代码会卡住。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int a[123456], b[123456]; //数组不定义在前面生成不了全为0的数组,devcpp中没遇到过这个问题
void main()
{
// 确认数组范围
int iMin, iMax, n;
printf("Please Input the Minimum Number: ");
scanf("%d", &iMin);
printf("Please Input the Maximum Number: ");
scanf("%d", &iMax);
n = iMax - iMin + 1;
srand(time(0));
// 随机数记录在数组a下标:
int r, i;
for (i = 0; i < 123456; i++)
{ // 循环次数远远大于随机数数量确保一定能生成全部所需随机数
r = rand() % n + iMin;
if (a[r] == 0)
{ // 避免多次更改数组元素
a[r] = i;
}
}
// 将随机数转换为数组b元素:
for (r = iMin; r <= iMax; r++)
{
b[a[r]] = r;
}
// 输出数组b元素:
for (i = 0; i < 123456; i++)
{
if (b[i] != 0)
{
printf("%d\n", b[i]);
}
}
}