为了生成一个随机数,我们需要用到一个函数——rand。
rand函数不需要任何参数,并且每次执行返回一个随机值。那么我们只需要接受rand的返回值就可
以得到一个随机值了,如下图:
这不是两张一样的图片,而是我运行了两次!它们生成的随机数列居然一模一样,这算是随机吗?
那么为什么会出现这种情况呢?接下来让我们了解一下rand生成随机数的原理!
事实上,可以将rand看做一个数列的通项(一个计算公式),你需要给它一个初始值(seed),然后它为你计算出一系列数字(有限个数)。
在同一次运行中调用rand时,它都会给你这个序列中的第一个数,然后这个数就被放到最后(下一次调用的就相当于原序列的第二个数了)。但下一次运行程序时这个序列会恢复原顺序
那么上面的例子就好解释了:我们并没有为rand定一个seed,那么系统就会自动设置seed为1,两次运行所得的随机数序列相同。再加上每次运行重置序列,导致了上述情况。
只要让seed时刻改变,就可以让随机数序列时刻改变,要得到真正随机的数字就需要srand函数和时间戳了。
srand函数需要一个无符号整型的参数,无返回值。srand可以把它的参数设置成seed。如果把时间戳((unsigned int)time(NULL))当作srand的参数,那么seed就可以时刻改变。(时间戳的概念是当前时间与之前的某一时间之差,全时间都一样,而且每秒都在改变。time函数可以返回时间戳并把时间戳存入参数中,我们不需要存入,所以把参数设为空指针。为了类型匹配,所以要强制类型转换)
用法如下:
注意注意注意!!!:
时间戳按秒更新,上图程序运行时间不足一秒,导致时间戳没有及时更新,生成的随机数不变,而且每次重新设置seed会将随机数序列重置,导致随机数序列不变,从而造成上述情况。所以整个程序中srand最好只调用一次。