测试运行时间:

#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;
}

运行结果图:
结果

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐