当前位置:首页 » 《随便一记》 » 正文

C语言rand、srand库函数生成随机数(附时间戳)

27 人参与  2024年10月11日 08:40  分类 : 《随便一记》  评论

点击全文阅读


目录

一、rand库函数

二、srand库函数

三、time库函数

四、rand、srand、time函数配合使用生成随机数

五、生成规定范围的随机数

六、补充说明


前言:当我们想要用C语言写程序来获取一个随机数时,该如何获取呢?这里我们上百度搜索一下

ee1ab4b5a6a64aa4835456aa02b7ddb8.png

这里就有提到使用rand、srand、time库函数搭配来获取随机数,也许根据其所说我们已经可以获得随机数解决问题,但想问题不能只浮于表面,下面我们来深入认识一下rand、srand、time库函数。

一、rand库函数

rand函数详尽信息:rand - C++ Reference (cplusplus.com)

38df4c002b674eae9e4d93760b4eac1e.png

rand函数是不需要给其传参数,其返回类型为int

dd80281a7d38468dae737c79ce3e724f.png

rand函数其返回值是介于(0~RAND_MAX)的随机值,RAND_MAX有多大呢?我们可以拷到vs里转定义

13bcd577c3de4a6a880d8b0423ea700b.png

0x7fff是一个十六进制数字,其十进制值为32,767,也就是说rand函数可以随机生成一个值在0~32767的随机数,看到这是不是感觉问题已经搞定了,别高兴太早!

953f1f961ce8451a9457b54c0d81c6eb.png

这里提到rand函数生成的是一个伪随机数,这个随机数是基于“种子”之上生成的,我们来看看。

b6436c5f7d5d4f74a501e916dbb5a6ca.png

2ffa18dcf02d4016b893f45809a6bee5.png

这里我们观察到两次运行得出的数据是一样的,那么这还能算得上随机数吗,都可以预测值了。

如果再深入了解⼀下,我们就不难发现,其实rand函数生成的随机数是伪随机的,伪随机数不是真正的随机数,是通过某种算法生成的随机数。真正的随机数的是无法预测下⼀个值是多少的。而rand函数是对⼀个叫“种子”的基准值进行运算生成的随机数。所以这里引出了srand库函数来对“种子”进行设置

二、srand库函数

srand函数详尽信息:srand - C++ Reference (cplusplus.com)

fd2b846eb96546b785faea5711da3e3e.png

srand函数需要接收一个无符号整形作为参数,其没有返回值,只用来执行设置rand函数“种子”的功能。程序中在调用rand函数之前先调用srand函数,通过srand函数的参数seed来设置rand函数生成随机数的时候的“种子”,只要“种子”在变化,每次生成的随机数序列也就变化起来了

4707b6ea2cb048b59eeba63939d97882.png

通过srand函数的参数seed来设置rand函数生成随机数的时候的“种子”。

7bad969d0762477492a90b851cc672b0.png

34a39f14fff847e4827f052290c931b3.png

这里我们可以看出通过srand函数对“种子”的设置,rand函数确实随机了起来,但是srand函数的参数如果不是一个随机值rand函数就不可能随机,但是我们就是要生成一个随机数,现在又需要一个随机数,这不是逻辑闭环了吗?那么如何让srand函数的参数随机起来呢?

三、time库函数

在程序中我们⼀般是使用程序运行的时间作为“种子”的,因为时间时刻在发生变化的。在C语言中有⼀个函数叫time,就可以获得这个时间。
time函数详尽信息:time - C++ Reference (cplusplus.com)

d14632ddbc5842d9a8e145fe8f9e1686.png

time函数会返回当前的日历时间,其实返回的是1970年1月1日0时0分0秒到现在程序运行时间之间的差值,单位是秒。返回的类型是time_t类型的,time_t类型本质上其实就是32位或者64位的整型类型

121fb63e7df549568803bbf2b0f80115.png

time函数的参数timer如果是非NULL的指针的话,函数也会将这个返回的差值放在timer指向的内存中带回去。如果timer是NULL,就只返回这个时间的差值。time函数返回的这个时间差也被叫做:时间戳

时间戳:

e09d946a3d6c47b7824160994e0d1249.png

time(NULL);//调⽤time函数返回时间戳,这⾥没有接收返回值

这样一来time函数也就返回时间戳了,因为时间总是在变化的,所以我们只要把时间戳传入srand函数即可。考虑到srand函数参数类型为unsigned int而time函数返回类型为time_t,为了不造成类型冲突,这里强制类型转换一下。

srand((unsigned int)time(NULL));

四、rand、srand、time函数配合使用生成随机数

#include <stdio.h>#include <stdlib.h>#include <time.h>int main(){//使⽤time函数的返回值设置种⼦//因为srand的参数是unsigned int类型,我们将time函数的返回值强制类型转换srand((unsigned int)time(NULL));printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());return 0;}

0dc049f9718e46549b4010f2dcfa6d73.png

e6b981f8bd4a4f9eadef8cd7e964ee72.png

e74c737a724b44bfa21306cfd8c74bd1.png

五、生成规定范围的随机数

生成1~100随机数:

srand((unsigned int)time(NULL));int ret = rand() % 100 + 1;

满一百就舍去,我们只需要将所得随机数对100取余数(可以得到0~99)再+1,便是值在1~100的数字了。

六、补充说明

1.rand、srand库函数头文件为<stdlib.h>,time库函数有文件为<time.h>。

2.对于srand函数在每次程序开始调用一次对“种子”设置一下就好,不必频繁使用。
 


点击全文阅读


本文链接:http://zhangshiyu.com/post/170356.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1