C语言rand()函数产生随机数详解

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

1.rand函数的原型,功能和界限

rand函数的原型:

#include <stdlib.h>

int rand(void);

rand函数的功能: 用来产生一个随机数

rand函数的界限: stdlib.h头文件中有宏#define RAND_MAX 0x7fff,这表示rand产生一个0-0x7fff的随机数,即最大是32767的一个数

2.用rand函数获取随机数

rand函数获取随机数的基础用法为:

rand()%a;

a是一个整数,返回值为0到a的随机数,包含0,但不包含a。

如果想要产生一个0-99之间的随机数,那么用法如下:

int num = rand() % 100;

如果想要产生一个1-100之间的随机数,那么用法如下:

int num = rand() % 100 + 1;

同理,如果想要产生一个1-60之间的随机数,那么用法如下:

 int num = rand() % 60 + 1;//产生一个1-60之间的数

从上面的例子中我们可以推理出m-----n的随机数:

rand()%(n-m+1) + m;

比如获取15~43的随机数:

rand()%29+15;

获取小数:
我们只需要将返回值除以10或者其他合适的数,并且在输出时保留若干位小数就可以获取随机小数。

C语言rand()函数产生随机数详解

这里一定要用10.0,不能用整型。

3.随机数生成原理

我们先来看看下面这段代码,反复运行该段代码,我们会发现每次产生的随机数的值都是相同的。

#include<stdio.h>
#include<stdlib.h>


int main()
{

	int ch = rand();
	printf("%d\n", ch);
	
	return 0;
}

这是因为rand函数产生的随机数是伪随机数,它除了被a的值控制外,还被一个隐藏的全局变量seed控制。它实际上是根据a和一个种子按照某个公式推算出来的。

在调用rand函数之前,会先查询是否主动调用过srand(seed)来为伪随机数生成器设定种子,如果有,那么就按照我们的代码设定种子,即初始化seed的起始值,若没有调用srand(seed),那么系统会自动给seed赋初始值,即自动调用srand(1)一次,也就是将seed的值设置为1。如果每次调用rand函数时,种子相同,那么根据公式产生的伪随机数将是相同的。

上面那段代码因为每次运行程序你都没有主动调用srand函数给seed赋值,因此每次都会默认调用srand(1),将seed的值赋值为1,也就是每次seed的值都相同,所以产生的伪随机数不会发生变化。

所以为了让每次产生的随机数不相同,那么我们就需要让每次调用rand函数之前设定的种子不相同,我们可以使用系统时间作种子srand(time(NULL);由于每次运行程序的时间肯定不相同,那么每次设定的种子也就不相同,那么产生的随机数肯定也就不一样了。

srand函数的原型:

#include<stdlib.h>
void srand( unsigned int seed );

我们使用time函数来获取系统时间,time函数的原型如下:

#include<time.h>
time_t time(time_t *tloc);//time_t类型被定义为一个长整型

使用time函数得到的值是一个时间戳,即从1970年1月1日0点到现在时间的秒数,然后将得到的time_t类型数据转化为(unsigned int)的数,再传给srand函数,用法如下:

int main()
{
	srand((unsigned int)time(NULL));
	int ch = rand();
	printf("%d\n", ch);
	
	return 0;
}

添加了srand((unsigned int)time(NULL));之后,当你再次运行该段代码时,你就会发现,每次生成的随机数就不同了。

如果仍然觉得时间间隔太小,可以在(unsigned int)time(0)或者(unsigned int)time(NULL)后面乘上某个合适的整数。 例如,srand((unsigned int)time(NULL)*10),time的参数传NULL表示不需要经过参数得到time_t数据。

还有另外一种初始化种子的方式如下,用进程的pid作为种子值seed,在同一个程序中,这样的种子的值是相同的。文章来源地址https://www.toymoban.com/news/detail-457460.html

srand((unsigned int)getpid());

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

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

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

相关文章

  • Qt产生随机数

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

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

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

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

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

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

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

    2024年02月02日
    浏览(34)
  • C语言随机数生成和范围设置详解【超详细教程】

    本文详细介绍了C语言中如何使用rand函数生成随机数以及利用srand函数设置随机数的种子,同时解释了如何控制随机数的范围。适合初学者学习和实践。

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

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

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

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

    2024年02月09日
    浏览(35)
  • 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日
    浏览(36)
  • 生成随机数——C语言

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

    2024年02月12日
    浏览(43)
  • 一文详解安全随机数

    本文分享自华为云社区《【安全攻防】深入浅出实战系列专题-安全随机数》,作者: MDKing 。 使用随机数可分类安全场景跟非安全场景。非安全场景需要生成的越快越好。安全场景使用的随机数必须足够安全,保证不能被预测到。 常见的非安全场景: 数据的索引号、标识;

    2024年02月05日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包