伪随机生成器(rand函数),随机数种子(srand函数)详细解读与分析:

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

1,rand函数:

2,srand函数:

1)srand函数的介绍:

2)srand函数各个参数的解释:

3)种子函数调用时间函数的具体分析:

4)srand函数生成随机数的代码分析:

a.生成随机数;

b.生成0~100以内的随机数

c.随机数的连续输出及其连续输出情况讲解与分析

1,rand:

首先我们来看一下rand函数(伪随机数生成器):

伪随机数生成器,c++,c语言,算法,经验分享

 rand函数,即伪随机数生成器,该函数返回类型为整型,没有参数,即产生一个在(0-rand_max(十六进制的ox7ffff转化为整数即32767)的一个随机数),在调用时不会出现函数返回错误的情况;然后我们看一下最后的这一句话:再调用rand函数之前,我们需要使用srand函数为随机数生成器设定种子。

那么问题来了,为什么一定需要使用srand函数呢?如果没有srand 又会怎么样呢?

(百度解释:伪随机数生成器是一个电脑固定的运算程序,并且前一个输出是下一个运算的输入,但计算机的数值储存是有限的,因此必然会再循环的某一时刻产生于前面相同的结果,从此开始重复前面的一个循环。)例如:我们随机生成十个整数

伪随机数生成器,c++,c语言,算法,经验分享

无论我们怎么去运行这个代码它只会重复上一个运行结果,也就是不管运行多少次结果都是这十个数,并不是我们想要的随机数,这就无法满足我们对数值随机获取的期望;如果强行对固定的随机数进行修改就会导致系统会崩溃,那么我们该怎么办呢?这时我们会想到使用(srand)。

2,srand函数:

1)srand种子函数介绍:

伪随机数生成器,c++,c语言,算法,经验分享

 首先,该函数是一个种子函数,通过定义可以看出该函数需要设置一个随机数起点,没有无返回值,函数以一个种子作为函数的参数。对于参数类型,值得提的一点是,我们可能也会看见别人定义该函数时这样定义:void srand((unsigned)seed)按道理说这样定义是可以的,但这是比较旧的写法,在有些编译器中可能不太支持这样去定义,所以最好还是用unsigned int 来取代unsigned 比较好

伪随机数生成器,c++,c语言,算法,经验分享

2)对种子函数的描述及其详细解析:

 

那我们看看这一段描述:字面翻译是这样的:srand函数设置了生成一系列伪随机整数的起点,要重新初始化,使用1作为种子参数,种子里面的任何其他值将生成器设置为一个随机起点rand检索生成的伪随机数,在调用srand之前调用rand与调用srand时种子为1相同的序列。由于出现术语,可能会有部分像我这样的新人是很难理解这段话中的神奇的“1”,所以我们再将其专业术语转化为我们可以接受的语言:但我们需要明白一个前提:(计算机并不能产生真正的随机数,而是已经编写好的一些无规则排列的数字存储在电脑里,把这些数字划分为若干相等的N份,并为每份加上一个编号用srand()函数获取这个编号,然后rand()就按顺序获取这些数字,当srand()的参数值固定的时候,rand()获得的数也是固定的,所以一般srand的参数用time(NULL),因为系统的时间一直在变,所以rand()获得的数,也就一直在变,相当于是随机数了。只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟。如果想在一个程序中生成随机数序列,需要至多在生成随机数之前设置一次随机种子。)所以,这里面每个随机数都会有一个下标,定义中的1,也就是下标为1的随机数。而且每个随机数都会有一个对应的下标,在srand种子中,我们下标1才是随机数的起点,可不要和数组弄反了哦!

3)引入时间函数作为种子函数的参数:

因为单独使用rand时,每次rand函数获取的随机数种子都是相同的,所以我们需要用srand函数对rand函数重新播种。我们不能使用一个固定不变的值作为srand函数的种子,因为当我们的随机数种子不发生变化时,我们随机数获取的数值就也就不会发生变化,所以也就不符合我们的预期,所以我们需要一个一直都可以变化数,那么问题又来了什么东西可以一直都在变化呢?

(时代一直在变(笑哭),开个玩笑啦),在计算机里面时间一直都是在变化的,所以我们需要调用时间函数来获取此刻的时间函数time()(#include<time.h>)我们会牵扯到一个叫时间戳的概念具体时间函数在这里我们不需要了解太多,我们可以理解为某个时刻的时间即可。

4)代码分析:

a.生成随机数:

接下来让我们用代码操作一下:

伪随机数生成器,c++,c语言,算法,经验分享

 这时候我们多次运行就会发现,我们每次生成的随机数都是不同的,因为我们随机数种子函数是以时间作为参数,时间是无时无刻都在发生变化的,所以每次运行得到的随机数都是不同的

我们这要按照函数格式定义,再使用循环就可以将我们的随机数打印出来;

伪随机数生成器,c++,c语言,算法,经验分享

伪随机数生成器,c++,c语言,算法,经验分享

 显然两次生成的随机数都是不同的,也就证明了时间的一直变化。

b.生成0~100以内随机数:

 我们如果要控制随机数的范围在某个数以内时,我们可以用取模运算快速运算进行操作,例如,我要输入0~100以内的随机数:

伪随机数生成器,c++,c语言,算法,经验分享

 我们只需要用随机数除100取余就可以啦!

c.连续输入随机数:

我们用for循环来实现,我们先看代码:

伪随机数生成器,c++,c语言,算法,经验分享 我们可以发现,我们输出的十个随机数都是一样的,这是为什么呢?伪随机数生成器,c++,c语言,算法,经验分享伪随机数生成器,c++,c语言,算法,经验分享

因为我们的随机数种子的产生和时间有关,而我们所用的时间函数中的时间最多只能精确到秒,由图可知,我们的for运行速度是非常快的,所以在for输入的10个数以内的总时间还没有达到一秒,时间来不及变化,于是造就了每次所用的随机数种子都是一样的,便有了输出的数字都是一样的尴尬结果,为了验证我们推断的正确性,我们可以在每次循环的时候都停留0.5秒,就是相当于拉长了每次循环所用的时间,然后出现这样的结果:

伪随机数生成器,c++,c语言,算法,经验分享

 所以这就完美的解释了上面随机数相同的情况,而且从图中我们也可以很好的解释了我们前面所说的程序使用的时间函数调用的时间精确到秒的概念。

怎么说呢,我感觉随机数种子和随机数的概念挺抽象的吧,(不知道大家对这个概念有多少困惑,反正对我来说差点崩溃了,确实花费了大量的时间才理解的 )但我在这里也做了大量的分析,希望能给各位朋友们带来一下概念上的理解和详细的具体操作。

好啦,时间不早啦,晚安咯,各位朋友们!文章来源地址https://www.toymoban.com/news/detail-667163.html

到了这里,关于伪随机生成器(rand函数),随机数种子(srand函数)详细解读与分析:的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【安全密钥】对基尔霍夫-洛-约翰逊噪声(KLJN)安全密钥交换协议的统计随机数生成器攻击(Matlab代码实现)

    【安全密钥】对基尔霍夫-洛-约翰逊噪声(KLJN)安全密钥交换协议的统计随机数生成器攻击(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码、数据、文章

    2024年04月12日
    浏览(13)
  • C语言rand()函数产生随机数详解

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

    rand函数的原型: rand函数的功能: 用来产生一个随机数 rand函数的界限: stdlib.h头文件中有宏#define RAND_MAX 0x7fff,这表示rand产生一个0-0x7fff的随机数,即最大是32767的一个数 rand函数获取随机数的基础用法为: a是一个整数,返回值为0到a的随机数,包含0,但不包含a。 如果想要

    2024年02月06日
    浏览(3)
  • rand()函数与srand()函数以及随机数种子详解

    rand()函数与srand()函数以及随机数种子详解

    初学者大部分对这两个函数的意义都不甚了解,以及不明白为什么需要srand()函数来播种,这里会对两函数的意义进行解释,让大家明白两函数搭配的作用,并对伪随机数以及真随机数进行讲解,最后会对随机数生成的原理进行一些探讨,希望对大家的学习理解有所帮助 格式

    2024年01月25日
    浏览(7)
  • C语言随机数的产生(rand、srand、time函数细节讲解)

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

    先上代码,再详细解释: 我们先来查询下rand函数 网站旧版我放在这儿,可以查询库函数等https://legacy.cplusplus.com/reference/cstring/strcat/ rand函数的头文件是stdlib.h。 rand函数无需传参数,返回类型是一个伪随机的整数范围是0到RAND_MAX。那这个RAND_MAX所对应的值是多少呢?我们同样

    2024年02月08日
    浏览(7)
  • rexp() R函数,生成服从指数分布的随机数

    参考: R语言 【rexp】__BANA的博客-CSDN博客

    2024年02月07日
    浏览(6)
  • Jmeter-BeanShell脚本中for循环里面使用random随机数函数,每次生成的都一样

    预想的是每次循环生成的随机数不一样,但实际使用Random函数生成的是重复的。 以下是部分原代码: 生成的updateList为: [{“id”:235214718648462,“dataId”:null,“data”:6708,“type”:“number”}, {“id”:318239582208002,“dataId”:333989510397954,“data”:6708,“type”:“number”}, {“id”:33398948

    2024年01月20日
    浏览(8)
  • JS - 生成随机数的方法汇总(不同范围、类型的随机数)

    (1)使用 random() 方法可以返回一个介于 0 ~ 1 之间的伪随机数(包括 0,不包括 1)。 (2)下面是一个测试样例 (1)这种最简单,因为和 random 的特点保持一致。只需使用如下公式即可: (2)比如下面生成 [10,15) 范围内的随机浮点数。 因为 random 的特点,要取得这几个区间

    2023年04月08日
    浏览(16)
  • Unity 中的随机数的基础常用的随机数生成方法

    在 Unity 中,可以使用 Random 类来生成随机数。以下是一些常用的随机数生成方法: Random.Range(min, max):生成一个在[min, max)范围内的随机整数。 Random.value:生成一个在[0, 1)范围内的随机浮点数。 Random.insideUnitCircle:生成一个在单位圆内的随机二维向量。 Random.insideUnitSphere:生成

    2024年02月20日
    浏览(15)
  • haiku生成随机数

    Haiku 遵循 JAX 的设计,生成的随机数是两个元素组成的列表。其中第一个元素是用于生成伪随机数的状态,第二个元素是用于分发密钥的子键。两个元素分别用于状态和子键,确保在分布式计算或并行计算中,多个随机数生成器的状态可以在一定程度上相互影响,从而提高随

    2024年01月20日
    浏览(14)
  • 生成随机数

    用于产生随机数 boolean nextBoolean() : 返回下一个伪随机数,它是取自此随机数生成器序列的均匀分布的 boolean 值。 void nextBytes(byte[] bytes) : 生成随机字节并将其置于用户提供的 byte 数组中。 double nextDouble() : 返回下一个伪随机数,它是取自此随机数生成器序列的、在 0.0 和 1.0 之

    2024年02月03日
    浏览(10)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包