生成可控范围随机数

本文详细探讨了如何使用C语言中的rand()函数生成伪随机数,并介绍了srand()函数设置种子的重要性,以及如何结合time()和时间戳实现真正的随机性。通过实例演示了如何限定rand()的输出范围和使用取余操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本篇博客将分析如何用代码优雅的生成随机数,涉及rand函数,srand函数,time函数,时间戳等概念。解释为什么又为神马是unsigned int (NULL)。

目录

rand()生成伪随机数

srand()传播种子

time()&&时间戳

随机值实现

rand()生成伪随机数

我们首先要知道rand函数是用于生成随机数的函数,只不过是伪随机数,那么何为伪随机数,我们理解为虽然是随机的数,但是每次执行起来的数值都是相同的。哪怕关机也不会改变生成的伪随机数。

 

 翻译一下:我们可以获取以下信息:rand函数返回值为int整型,头文件是需要引用<stdlib.h>。rand函数会生成0到RAND_MAX中的一个整型随机数。那么RAND_MAX有多大呢,Google以下我们知道RAND_MAX为32767。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i;
	for (i = 0; i < 100; i++)
	{
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

为何每次都相同呢,那是因为我们函数的种子没发生改变。用户未设定随机数种子时,系统默认的随机数种子为1。rand()产生的是伪随机数字,每次执行时是相同的,若要不同,用函数srand()初始化它。


srand()传播种子

 srand()用来设置rand()产生随机数时的随机数种子。和rand函数相同,用<stdlib.h>做头文件。

#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i;

	srand(200);//多了这一行

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

当我们改变()里的值意味着选用的不同的种子,所以srand(100)和srand(200)产生的数值会不一样。但多尝试几次发现,我们反复测试的随机数值还是相同。

为了每次生产随机数真正”随机“,我要介绍time函数。

time()&&时间戳

首先介绍什么是时间戳:

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总秒数。

用printf就可以打印出具体的时间戳啦!

printf("%d\n", (unsigned int)time(NULL));

 其中time函数需要调用time.h头文件。time函数的返回类型为time_t,因此我们用unsigned int 强制类型转换。

时间是正值,没有负值,所以加unsigned可以在有效空间内扩大可取值范围。例如如果    int最大是65535,那int unsigned zerofill最大就是65535 * 2。

结合时间戳以及time函数我们就可以真正生成一个随机值啦。代码如下:打印一百个随机值。
 

#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
	int i;
	srand((unsigned int)time(NULL));
	for (i = 0; i < 100; i++)
	{
		int ret = rand();
		printf("%d\n", ret);
	}
	return 0;
}

随机值实现

最后我们就差限定范围了

#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
	srand((unsigned int)time(NULL));
	int ret1 = rand() % 100;//生成0-99
	int ret2 = rand() % 100 + 1;//生成1-100
	int ret3 = rand() % 2022;//生成0-2021
	return 0;
}

不难想到用取余的方式实现。不过记得rand()%n的随机值生成范围是0——n-1

以上就是本篇博客的全部内容啦,希望对你有帮助。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值