‹  返回课程

如何理解C语言中的srand()函数中的随机数发生器的种子?

课文
阅读量:274
技术范畴
“随机数”在编程中被大量使用,比如想写一个抽奖程序,就依赖程序可以产生不确定的数字;但只有程序员知道,一旦“随机种子”被种下,第一个人能取到的数、第二个人能取到的数……直至第N个人能取得到的数,其实都已经定下来了。
课前导言
“随机数”在编程中被大量使用,比如想写一个抽奖程序,就依赖程序可以产生不确定的数字;但只有程序员知道,一旦“随机种子”被种下,第一个人能取到的数、第二个人能取到的数……直至第N个人能取得到的数,其实都已经定下来了。
如何理解C语言中的srand()函数中的随机数发生器的种子?
大白话说透“随机种子”以及“伪随机”是什么东西?

很好理解,想要随机数? 那我先准备一个数组:

int rns[] { 996, 1314, 8, 31, 4 };

然后一有人过来取随机数,第一个人我就给 996,第二个人给 1314,第三个人……一直到第六个人来取时,又给他996……怎么样?是不是很惊喜!是不是很随机?

程序运行了几次,听说有人要揍这个随机库的作者。理由是为什么每次都是从996开始,然后兜一圈继续……这随机个鬼?写个抽奖大赛都可以摸出规律作弊了。

所以嘛,你给我一个种子嘛!比如是当前时间距离1970年1月1日零时的秒数,假设是1956233408。然后我自己再给个 i 用以记录是第几次兜圈,i 从1开始。于是有:

  • 第1个随机数:996 x i + 1956233408 ÷ i ,

  • 第2个随机数:1314 x i + 1956233408 ÷ i ,

  • 第3个随机数:8 x i + 1956233408 ÷ i,

  • ……

虽然还是会被揍,但至少我给自己留出了携码潜逃的时间。