C语言随机数的产生(rand、srand、time函数细节讲解)

这篇具有很好参考价值的文章主要介绍了C语言随机数的产生(rand、srand、time函数细节讲解)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

随机数生成代码:

先上代码,再详细解释:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
	srand((unsigned int)time(NULL));
	//随机数生成器
	int ret = rand()%100+1;
	//随机数赋值,和范围限定
	printf("%d\n", ret);
	return 0;
}

rand函数:

  • 我们先来查询下rand函数
  • 网站旧版我放在这儿,可以查询库函数等https://legacy.cplusplus.com/reference/cstring/strcat/

rand头文件,c语言,算法,开发语言,c++


    1. rand函数的头文件是<stdlib.h>。
    1. rand函数无需传参数,返回类型是一个伪随机的整数范围是0到RAND_MAX。那这个RAND_MAX所对应的值是多少呢?我们同样来查询下RAND_MAX。

rand头文件,c语言,算法,开发语言,c++

这里就明确表明了他对应的整数值:32767.

    1. rand函数范围限定:原本rand函数范围0~32767范围很广,我们往往不需要这么大,所以就需要规划rand函数返回值在我们需要的范围内,通过下面的方式来:

rand头文件,c语言,算法,开发语言,c++

    1. 从rand函数介绍第二段我们了解到,这个数字是由一个算法生成的,该算法每次调用时都返回一个明显不相关的数字序列。该算法使用种子来生成序列,该序列应该使用函数srand初始化为一些独特的值。
  • srand函数(提供)------>算法数列(决定)----->rand函数返回值

伪随机数:
rand函数返回的是伪随机数,也就是说他返回的并不是真正的随机数,而是一个在那个范围内的一个固定整数。比如:我用VS2019编译打印出来固定是41

  • 这个时候我们就要用到一个随机的种子,来随机算法数列也就完成了随机rand函数返回值。

???😦什么呆呆你在开玩笑吧,我要rand产生一个随机数,现在你又要一个随机数种子来完成,这不是开玩笑吗?
!!!😀是的,没有在开玩笑,还记得这句话吗?rand函数无需传参数 这里也就表示了无法输入值进行更改,而是由本身函数算法决定返回值所以我们就引入可串参数改变的srand函数;

srand函数:

  • 我们查询下srand函数.

rand头文件,c语言,算法,开发语言,c++

传入的参数是无符号整形种子,所以在上述随机值代码中强制类型转换了time函数返回值
这里每句话都是关键,所以我提供一张翻译的图
rand头文件,c语言,算法,开发语言,c++

从结合上述内容我们已经完全就清楚了,我们就彻底清楚原因了。
这里我们就不过多赘述,就主要看下最后一段

为了生成类似随机的数字,srand通常被初始化为一些独特的运行时值,比如函数time返回的值(在头中声明)。这对于大多数琐碎的随机化需求来说是足够独特的。

这里提到了函数time函数返回值,所以又要引入time函数;

time函数:

  • 老规矩,我们先来查询下time函数.

rand头文件,c语言,算法,开发语言,c++

  • 这里我们就只需要了解time函数头文件<time.h>,返回类型是time_t(也就是long int类型),也就是返回时间戳,传入参数为时间指针,还有个时间戳的概念:说我们当前时间到1970年1月1日00:00小时以来的秒数(即当前unix时间戳)。

time函数补充:

  • 算了,我还是多讲一些time函数吧,这里与随机值无关:
time_t time( time_t *timer );

time_t类型讨论

time_t是(long还是long long的讨论),能确定的是time_t始终占8个字节
rand头文件,c语言,算法,开发语言,c++
从这位大佬总结的图中,我们就很清楚的认识到,讨论应当先分平台,在分多少位;

  • 总结:若在Windows平台全是long long,Linux平台32位为long,64位为long long。
    这里就要注意项目转平台时要调整。

time_t指针传入的讨论:

返回值如上面所说,返回时间戳(当前时间到1970年1月1日00:00小时以来的秒数);

    1. 当传入的time_t指针为空指针(NULL)时,不会将返回值赋值到time_t指针指向的空间里;
    1. 当传入的time_t指针不为空指针(NULL)时,会将返回值赋值到time_t指针指向的空间里;(不好演示证明)

代码演示证明:

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()

{
	time_t a = 1;
	srand((unsigned int)time(&a));
	printf("%lld\n", a);

	time_t b = 2;
	srand((unsigned int)time(&b));
	printf("%lld\n", b);
	
	srand((unsigned int)time(NULL));

	return 0;
}

rand头文件,c语言,算法,开发语言,c++
总结:文章来源地址https://www.toymoban.com/news/detail-718432.html

  • 这个代码的实现为我们后面的许多项目设计提供了一定的基础;
  • 要注意头文件,参数的传入类型,返回值类型;
  • time函数(随机种子提供)------>srand函数(提供)------>算法数列(决定)------>rand函数返回值------>限制所需范围

到了这里,关于C语言随机数的产生(rand、srand、time函数细节讲解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LINUX相关】生成随机数(srand、/dev/random 和 /dev/urandom )

    在一个循环中,生成多组随机值,发现最终的结果都一样,结果是调用的函数如下,在函数中设置了随机种子,且是以秒为单位,那么在一秒类,由于都是用一个种子,srand又是伪随机,所以最终生成的都是同一组随机字符。 2.1 修改种子 (1)将 srand(time(NULL)); 放到循环外面

    2024年02月12日
    浏览(47)
  • Qt产生随机数

    提问: 有没有小伙伴遇到这么一种情况,使用rand()和qrand()函数生成的随机数好像不是那么随机,每次都一样。那这种就叫做“伪随机”,因为没有种随机数种子,所以系统默认随机数种子是固定值。 在Qt项目中呢,生成随机数有两个步骤: 1.使用qsrand()种随机数种子 2.调用

    2024年02月11日
    浏览(43)
  • STM32产生随机数

    STM32有2种方式产生随机数:硬件方式和软件方式 其中软件方式可以通过C语言标准函数 stdlib.h 的 srand() 和 rand() 来获取随机数,使用步骤为: 使用 srand(seed) 来设置随机数种子。我们知道种子不改变的时候,产生多个随机数的时候,第一次产生的数字是随机的,后面产生的都与

    2024年02月12日
    浏览(39)
  • STM32 产生随机数方式

    C语言的stdlib.h库里的srand(unsigned seed)和rand(void)函数,可以配合产生伪随机数。其中srand(seed)产生算法种子,再由rand()通过算法产生随机数,产生的随机数在宏定义RAND_MAX范围内。如果seed不变,则产生的随机数不变。 这里介绍STM32 HAL库环境的随机数产生代码,采用STM32CUBEIDE开发

    2024年02月09日
    浏览(45)
  • 在MATLAB产生正态(Gauss)分布随机数

    在 MATLAB 中内置了有产生标准正态(Gauss)分布的随机数函数,使用方法如下: 其中 m、n 为产生矩阵的行数和列数, p 为产生矩阵的个数,产生的矩阵中的每个元素均为服从 N ( 0 , 1 ) N(0, 1) N ( 0 , 1 ) 的标准正态分布的元素。 使用如下命令产生一个 100x1 的服从 标准正态(Gauss)分布

    2024年02月02日
    浏览(43)
  • 基于FPGA的LFSR16位伪随机数产生算法实现,可以配置不同的随机数种子和改生成多项式,包含testbench

    目录 1.算法仿真效果 2.算法涉及理论知识概要 3.Verilog核心程序 4.完整算法代码文件 vivado2019.2仿真结果如下:           LFSR(线性反馈移位寄存器)提供了一种在微控制器上快速生成非序列数字列表的简单方法。生成伪随机数只需要右移操作和 XOR 操作。LFSR 完全由其多项式

    2024年02月11日
    浏览(44)
  • Google Earth Engine(GEE)——土地分类精度分析randomColumn产生伪随机数然后进行混淆矩阵计算

    我们在进行土地分类时,需要进行精度验证,但是之前我们要进行样本点的随机分类,也就是分出一部分作为训练样本另外一部分作为,这是我们要想产生随机种子赋值给我们所选定的训练样本,这样我们就可以随机将样本进行分成训练样本和验证样本,而我们使用的函数

    2024年02月09日
    浏览(50)
  • mysql随机数函数

    declare@iint select@i=count(*)fromA while@i0 begin UpdateAsetB=ceiling(rand()*150+50)whereid=@i set@i=@i-1 id是表A里的自增长列,不清楚你的表里有没有,若是没有的话,可以自己造个临时表,插入数据。 本回答由提问者推荐 UUID是一个由5位十六进制数的字符串表示的128比特数字,其格式为aaaaaaaa-

    2023年04月11日
    浏览(45)
  • 生成随机数——C语言

    在C语言中,可以使用标准库函数 rand() 来生成随机数。需要注意的是, rand() 函数生成的是伪随机数,具体的随机序列取决于种子(seed)的值。 下面是一个简单的示例代码,展示如何在C语言中生成随机数: 在上述代码中,首先包含了 stdio.h 、 stdlib.h 和 time.h 头文件来使用相

    2024年02月12日
    浏览(55)
  • 明明的随机数【C语言】

    明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。 数据范围: 1≤ n ≤1000 ,输入的数字大小满足 1≤ val ≤500 第一行先输入随机整数的个数 N 。 接下来的

    2024年01月16日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包