PHP的rand功能真的那么糟糕吗?

时间:2013-01-09 20:49:25

标签: php prng

我知道鼓励使用mt_rand()而不是rand(),因为它使用Mersenne Twister而不是PRNG rand()使用的任何内容,但这里似乎永远不会考虑因素:用户活性。

事实上,用户的行为可以被认为是非常随机的。例如,在任何给定时刻,用户可能有4%的可能触发一个功能的rand()呼叫,用户触发三个rand()呼叫的概率为8%,{{1 ,20%的用户触发两次shuffle()次呼叫,每次用户加载页面时,PRNG都会前进一次。

毕竟,不是NPC运动是什么让神奇宝贝游戏中的RNG滥用如此令人沮丧?

因此,请注意,虽然rand()确实有其模式,但用户活动的随机性和rand()的使用的多样性足以使rand()成为rand()缺点无关紧要?从绝对意义上讲,mt_rand()是“更随机的”。但这与人体元素的熵相比如何?

2 个答案:

答案 0 :(得分:4)

如果你假设rand()的调用是由人类用户随机生成的,那么我猜你的逻辑是正确的。

但是想象一个机器人每隔X秒发送相同的请求(夜间不被人类呼叫中断)或者运行一段时间的简单脚本并逐个运行rand()。那么你就不能完全依赖随机性。

来自php.net的评论:

  

请注意,自动播种似乎是用电流完成的   秒数表示您可以获得相同的结果   在快速服务器上运行。要么自己调用srand()更多   经常更换种子或使用看似不合适的mt_rand()   遇到了这个问题。

答案 1 :(得分:0)

  

但这与人体元素的熵相比如何?

我想象这个场景:

  • 一个拥有数千名用户的游戏。
  • 出于某种原因,每隔X分钟,您应该为每个用户设置一个随机值(每次都给予相同的订单)

由于伪随机函数,用户XXX更可能并且用户YYY总是具有相同的距离。因为伪随机问题之一,就是在足够数量的循环后,一个区域可以“更加”可预测。