[C]生成指定范围内不重复元素的随机数数列的四种方法
测试运行时间:#include <stdio.h>#include <stdlib.h>#include <time.h>int main() {//准备(不计入运算时间)int a, b, c, d;int rand_var;int *number;char *used;clock_t c_t;srand(1);printf("请输入生成随机数的范围(a~b)
·
测试运行时间:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
//准备(不计入运算时间)
int a, b, c, d;
int rand_var;
int *number;
char *used;
clock_t c_t;
srand(1);
printf("请输入生成随机数的范围(a~b):");
scanf_s("%d~%d", &a, &b);
if (a > b)
return 0;
number = (int*)malloc(sizeof(int)*(b - a + 1));
/*
方法1:
先初始化number数组,每个元素的值都为一个不在范围内的数(此处a-1必然是不在范围内的数)
抽取随机数,如果number[随机数]是a-1,则录入一次c的值,并++c,否则c不变,重新抽取随机数
*/
c_t = clock();
for (c = a; c <= b; ++c)
number[c - a] = a - 1;
for (c = a; c <= b; ++c) {
rand_var = rand() % (b - a+1);
if (number[rand_var] == a - 1)
number[rand_var] = c;
else
--c;
}
c_t = clock() - c_t;
printf("第一种生成方法花费时间:%dms\n", c_t);
/*
方法2:
抽取随机数,并且与之前抽取过的数进行遍历比较,若不同则录入,否则重新抽取
*/
c_t = clock();
for (c = a; c <= b; ++c) {
rand_var = rand() % (b - a + 1) + a;
for (d = a; d < c; ++d)
if (number[d - a] == rand_var)
break;
if (d == c)
number[c - a] = rand_var;
else
--c;
}
c_t = clock() - c_t;
printf("第二种生成方法花费时间:%dms\n", c_t);
/*
方法3:
准备一个额外的used数组,并初始化0
抽取随机数,如果used[随机数]为0,则录入该随机数进number,否则重新抽取随机数
*/
c_t = clock();
used = (char*)malloc(sizeof(char)*(b - a + 1));
for (c = a; c <= b; ++c)
used[c - a] = 0;
for (c = a; c <= b; ++c) {
rand_var = rand() % (b - a + 1);
if (used[rand_var])
--c;
else {
used[rand_var] = 1;
number[c - a] = rand_var + a;
}
}
free(used);
c_t = clock() - c_t;
printf("第三种生成方法花费时间:%dms\n", c_t);
/*
方法4:
先初始化number数组,每个元素从a到b已经顺序排列完成
抽取随机数作为下标,从而进行随机换位从而达到目的
*/
c_t = clock();
for (c = a; c <= b; ++c)
number[c - a] = c;
for (c = a; c <= b; ++c) {
rand_var=rand() % (c - a + 1);
if (rand_var != c - a) {
number[c - a] ^= number[rand_var];
number[rand_var] ^= number[c - a];
number[c - a] ^= number[rand_var];
}
}
c_t = clock() - c_t;
printf("第四种生成方法花费时间:%dms\n", c_t);
free(number);
return 0;
}
运行结果图:
==============================================================================
输出随机数列:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main() {
//准备
int a, b, c, d;
int rand_var;
int *number;
char *used;
clock_t c_t;
srand(1);
printf("请输入生成随机数的范围(a~b):");
scanf_s("%d~%d", &a, &b);
if (a > b)
return 0;
number = (int*)malloc(sizeof(int)*(b - a + 1));
/*
方法1:
先初始化number数组,每个元素的值都为一个不在范围内的数(此处a-1必然是不在范围内的数)
抽取随机数,如果number[随机数]是a-1,则录入一次c的值,并++c,否则c不变,重新抽取随机数
*/
for (c = a; c <= b; ++c)
number[c - a] = a - 1;
for (c = a; c <= b; ++c) {
rand_var = rand() % (b - a+1);
if (number[rand_var] == a - 1)
number[rand_var] = c;
else
--c;
}
printf("第一种方法:");
for (c = a; c <= b; ++c)
printf("%d ", number[c - a]);
printf("\n");
/*
方法2:
抽取随机数,并且与之前抽取过的数进行遍历比较,若不同则录入,否则重新抽取
*/
for (c = a; c <= b; ++c) {
rand_var = rand() % (b - a + 1) + a;
for (d = a; d < c; ++d)
if (number[d - a] == rand_var)
break;
if (d == c)
number[c - a] = rand_var;
else
--c;
}
printf("第二种方法:");
for (c = a; c <= b; ++c)
printf("%d ", number[c - a]);
printf("\n");
/*
方法3:
准备一个额外的used数组,并初始化0
抽取随机数,如果used[随机数]为0,则录入该随机数进number,否则重新抽取随机数
*/
used = (char*)malloc(sizeof(char)*(b - a + 1));
for (c = a; c <= b; ++c)
used[c - a] = 0;
for (c = a; c <= b; ++c) {
rand_var = rand() % (b - a + 1);
if (used[rand_var])
--c;
else {
used[rand_var] = 1;
number[c - a] = rand_var + a;
}
}
free(used);
printf("第三种方法:");
for (c = a; c <= b; ++c)
printf("%d ", number[c - a]);
printf("\n");
/*
方法4:
先初始化number数组,每个元素从a到b已经顺序排列完成
抽取随机数作为下标,从而进行随机换位从而达到目的
*/
for (c = a; c <= b; ++c)
number[c - a] = c;
for (c = a; c <= b; ++c) {
rand_var=rand() % (c - a + 1);
if (rand_var != c - a) {
number[c - a] ^= number[rand_var];
number[rand_var] ^= number[c - a];
number[c - a] ^= number[rand_var];
}
}
printf("第四种方法:");
for (c = a; c <= b; ++c)
printf("%d ", number[c - a]);
printf("\n");
free(number);
return 0;
}
运行结果图:
更多推荐


所有评论(0)