关于C中取随机数的方法

采用rand()函数的方法

int main() {
	for (int i = 1; i <=10;i++) {
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

此时生成的随机数序列为(第一次结果):

第二次结果:

但会发现每次生成的随机数序列都为这些数字,并没有达到随机的效果,去API文档中查阅关于rand()函数的说明:

根据说明,得知rand()函数每次都会返回一个0-32767(RAND_MAX)之间的数字,但在使用前需要用srand()函数定义一个随机数的生成器

在API文档中查阅关于srand()函数的描述:

需要传入一个整数且引用头文件<stdlib.h>,尝试补充之前的代码:(传入整数为100)

int main() {
	for (int i = 1; i <=10;i++) {
		srand(100);
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

运行结果如下:

传入整数为200:

int main() {
	for (int i = 1; i <=10;i++) {
		srand(200);
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

我们会发现传入整数不同时的确会生成不同的随机数,但是每次的随机结果是固定的,还是没有达到随机的效果,因此判断出如果srand()函数中传入的是一个随机整数,可以达到我们想要的每次都是随机数的效果

所以我们考虑到可以利用时间戳这样一个随机值,利用time()函数

查阅API文档:

需要引用头文件<time.h>,且需要传入一个指针变量,我们选择传入NULL值,返回类型为time_t,在32位中它是long类型,在64位中它是_int64类型,但srand()函数需要传入unsigned int 类型的值,所以需要强制转换类型

代码如下:

int main() {
	for (int i = 1; i <=10;i++) {
		srand((unsigned int)time(NULL));
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

生成结果如下:(第一次)

第二次:

明显的看到,问题还是没有得到解决

调试代码,发现原因:

int main() {
	for (int i = 1; i <=10;i++) {
		srand((unsigned int)time(NULL));
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

这段代码中,每次循环都重新设置了一次随机数生成的起点导致了上述问题的产生

而随机数生成起点只需要一次即可,我们将他移到循环的外部:

int main() {
	srand((unsigned int)time(NULL));
	for (int i = 1; i <=10;i++) {
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

再次执行代码:(第一次)

第二次:

问题终于得到了解决,如果我们想要控制随机数生成的范围,那么我们可以利用取模运算来达到目的,例如需要生成0-100的随机数字,代码如下:

int main() {
	srand((unsigned int)time(NULL));
	for (int i = 1; i <=10;i++) {
		int ret = rand()%100+1;
		printf("%d\n", ret);
	}
	return 0;
}

运行结果(第一次):

第二次:

可以看到,我们达到了预期的结果

以上内容为我对C中取随机数方法的探究

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值