LV05-07-Linux系统-03-随机数
本文主要是用Linux系统中获取随机数的相关笔记,若笔记中有错误或者不合适的地方,欢迎批评指正😃。
点击查看使用工具及版本
Windows | windows11 |
Ubuntu | Ubuntu16.04的64位版本 |
VMware® Workstation 16 Pro | 16.2.3 build-19376536 |
SecureCRT | Version 8.7.2 (x64 build 2214) - 正式版-2020年5月14日 |
开发板 | 正点原子 i.MX6ULL Linux阿尔法开发板 |
uboot | NXP官方提供的uboot,NXP提供的版本为uboot-imx-rel_imx_4.1.15_2.1.0_ga(使用的uboot版本为U-Boot 2016.03) |
linux内核 | linux-4.15(NXP官方提供) |
STM32开发板 | 正点原子战舰V3(STM32F103ZET6) |
点击查看本文参考资料
参考方向 | 参考原文 |
--- | --- |
四、随机数
在很多时候我们都有可能会用到随机数,就自己一个一个写吗?不可能的,这辈子都不可能自己写的,哈哈。
1. 伪随机数?
随机数是随机出现,没有任何规律的一组数列。在我们编程当中,是没有办法获得真正意义上的随机数列的,这是一种理想的情况,在我们的程序当中想要使用随机数列,只能通过算法得到一个伪随机数序列,那在编程当中说到的随机数,基本都是指伪随机数。
2. rand() 函数
2.1 函数说明
在linux
下可以使用man 3 rand
命令查看该函数的帮助手册。
1 | /* 需包含的头文件 */ |
【函数说明】该函数用于获取一个随机数,多次调用可以得到一组随机数序列。
【函数参数】none
【返回值】int
类型,返回一个介于0
到RAND_MAX
(包含)之间的值,也就是闭区间上的[0, RAND_MAX]
。我在Ubuntu 21.04
的64
位版本上试了一下,这个RAND_MAX
值是2147483647
。
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】
(1)调用rand()
可以得到[0, RAND_MAX]
之间的伪随机数,多次调用rand()
便可以生成一组伪随机数序列,但是需要注意,就是每一次运行程序所得到的随机数序列都是相同的。
(2)这里需要提到一个叫做种子的概念,rand()
函数通过种子生成随机数序列,当种子相同时,生成的随机数是相同的,当我们没有使用设置中子的函数(srand()
)时,也就是说如果没有提供种子值,rand()
函数将自动以1
作为种子值,所以每次程序运行产生的随机数序列都是一样的。
2.2 使用实例
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall # 生成可执行文件 a.out |
然后,终端会有以下信息显示:
1 | [83, 86, 77, 15, 93, 35, 86, 92] |
我们多运行几次,就会发现,产生的随机数永远都是这几个,也就是每个程序每次运行的时候得到的随机数都是一样的。
3. srand() 函数
3.1 函数说明
在linux
下可以使用man 3 srand
命令查看该函数的帮助手册。
1 | /* 需包含的头文件 */ |
【函数说明】该函数并不是用于生成随机数,srand()
函数将其参数设置为rand()
返回的伪随机整数新序列的种子。通过使用相同的种子值调用srand()
,也可以得到相同的伪随机数序列。
【函数参数】
seed
:unsigned int
类型,作为产生随机数的种子,一般参数会设置为日历时间,就是通过time()
函数获取的秒数,这样可以保证每次程序的运行所得到的的随机数序列不同。
【返回值】none
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】该函数需要与与rand()
一起使用。
3.2 使用实例
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall # 生成可执行文件 a.out |
然后,多运行几次,会发现产生的随机数序列是不同的了:
4. rand_r() 函数
4.1 函数说明
在linux
下可以使用man 3 rand_r
命令查看该函数的帮助手册。
1 | /* 需包含的头文件 */ |
【函数说明】该函数也用于生成随机数,与rand()
不同的是,它自带种子参数。
【函数参数】
seedp
:unsigned int
类型的指针变量,用于在调用之间存储状态,说实话,有点不理解这句话。在man
手册中有说,如果rand_r()
被调用时带有seedp
指向的整数的相同初始值,并且在调用之间不修改该值,那么将产生相同的伪随机序列。当这个值改变的时候,产生的随机序列也会发生变化。
【返回值】int
类型,返回一个介于0
到RAND_MAX
(包含)之间的值,也就是闭区间上的[0, RAND_MAX]
。
【使用格式】一般情况下基本使用格式如下:
1 | /* 需要包含的头文件 */ |
【注意事项】
(1)该函数与rand()
一样,每一次运行程序所得到的随机数序列都是相同的,想要每次产生不同的随机序列,我们可以使用日历时间作为随机数产生的种子,因为时间是不断变化的,所以每次启动程序,都会有不一样的种子,这也就意味着得到的随机序列也是不同的。
(2)seedp
的值,在一次调用之后似乎会自己变化,需要重新赋值,至少我自己尝试的时候是有这样的情况产生,无法将这个值++
或者--
。
4.2 使用实例1
下边的这个实例,每次程序启动产生的随机序列都会与上一次一样。
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall # 生成可执行文件 a.out |
然后,多运行几次,会发现产生的随机数序列是相同的:
4.3 使用实例2
下边的这个实例,每次程序启动产生的随机序列都会与上一次不同。
点击查看实例
1 |
|
在终端执行以下命令编译程序:
1 | gcc test.c -Wall # 生成可执行文件 a.out |
然后,终端会有以下信息显示: