本篇博客将分析如何用代码优雅的生成随机数,涉及rand函数,srand函数,time函数,时间戳等概念。解释为什么又为神马是unsigned int (NULL)。
目录
我们首先要知道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()用来设置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函数。
首先介绍什么是时间戳:
时间戳是指格林威治时间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
以上就是本篇博客的全部内容啦,希望对你有帮助。