1,rand函数:
2,srand函数:
1)srand函数的介绍:
2)srand函数各个参数的解释:
3)种子函数调用时间函数的具体分析:
4)srand函数生成随机数的代码分析:
a.生成随机数;
b.生成0~100以内的随机数
c.随机数的连续输出及其连续输出情况讲解与分析
1,rand:
首先我们来看一下rand函数(伪随机数生成器):
rand函数,即伪随机数生成器,该函数返回类型为整型,没有参数,即产生一个在(0-rand_max(十六进制的ox7ffff转化为整数即32767)的一个随机数),在调用时不会出现函数返回错误的情况;然后我们看一下最后的这一句话:再调用rand函数之前,我们需要使用srand函数为随机数生成器设定种子。
那么问题来了,为什么一定需要使用srand函数呢?如果没有srand 又会怎么样呢?
(百度解释:伪随机数生成器是一个电脑固定的运算程序,并且前一个输出是下一个运算的输入,但计算机的数值储存是有限的,因此必然会再循环的某一时刻产生于前面相同的结果,从此开始重复前面的一个循环。)例如:我们随机生成十个整数
无论我们怎么去运行这个代码它只会重复上一个运行结果,也就是不管运行多少次结果都是这十个数,并不是我们想要的随机数,这就无法满足我们对数值随机获取的期望;如果强行对固定的随机数进行修改就会导致系统会崩溃,那么我们该怎么办呢?这时我们会想到使用(srand)。
2,srand函数:
1)srand种子函数介绍:
首先,该函数是一个种子函数,通过定义可以看出该函数需要设置一个随机数起点,没有无返回值,函数以一个种子作为函数的参数。对于参数类型,值得提的一点是,我们可能也会看见别人定义该函数时这样定义:void srand((unsigned)seed)按道理说这样定义是可以的,但这是比较旧的写法,在有些编译器中可能不太支持这样去定义,所以最好还是用unsigned int 来取代unsigned 比较好
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)我们会牵扯到一个叫时间戳的概念具体时间函数在这里我们不需要了解太多,我们可以理解为某个时刻的时间即可。
4)代码分析:
a.生成随机数:
接下来让我们用代码操作一下:
这时候我们多次运行就会发现,我们每次生成的随机数都是不同的,因为我们随机数种子函数是以时间作为参数,时间是无时无刻都在发生变化的,所以每次运行得到的随机数都是不同的
我们这要按照函数格式定义,再使用循环就可以将我们的随机数打印出来;
显然两次生成的随机数都是不同的,也就证明了时间的一直变化。
b.生成0~100以内随机数:
我们如果要控制随机数的范围在某个数以内时,我们可以用取模运算快速运算进行操作,例如,我要输入0~100以内的随机数:
我们只需要用随机数除100取余就可以啦!
c.连续输入随机数:
我们用for循环来实现,我们先看代码:
我们可以发现,我们输出的十个随机数都是一样的,这是为什么呢?
因为我们的随机数种子的产生和时间有关,而我们所用的时间函数中的时间最多只能精确到秒,由图可知,我们的for运行速度是非常快的,所以在for输入的10个数以内的总时间还没有达到一秒,时间来不及变化,于是造就了每次所用的随机数种子都是一样的,便有了输出的数字都是一样的尴尬结果,为了验证我们推断的正确性,我们可以在每次循环的时候都停留0.5秒,就是相当于拉长了每次循环所用的时间,然后出现这样的结果:
所以这就完美的解释了上面随机数相同的情况,而且从图中我们也可以很好的解释了我们前面所说的程序使用的时间函数调用的时间精确到秒的概念。
怎么说呢,我感觉随机数种子和随机数的概念挺抽象的吧,(不知道大家对这个概念有多少困惑,反正对我来说差点崩溃了,确实花费了大量的时间才理解的 )但我在这里也做了大量的分析,希望能给各位朋友们带来一下概念上的理解和详细的具体操作。
好啦,时间不早啦,晚安咯,各位朋友们!