通俗讲解生成随机数的方法与原理!!!

文章探讨了rand函数在生成随机数时依赖于初始种子值的问题,指出未设置种子会导致每次运行结果相同。通过介绍srand和时间戳用于动态设置种子,解决了如何获得真正随机数的问题,同时强调了程序中srand调用时机的重要性。
摘要由CSDN通过智能技术生成

为了生成一个随机数,我们需要用到一个函数——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最好只调用一次。

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值