【发布时间】:2014-10-07 06:53:29
【问题描述】:
昨天无意中听到一个关于rand()和mt_rand()的对话,一位同事说这两个都是可以预测的,你应该使用不同的功能吗?我想知道,我知道rand() 在某种程度上是可以预测的,并且经过一些谷歌搜索。如果我没看错的话,即使mt_rand() 似乎也是可以预见的。
为此,我编写了一小段代码,用于创建图像:
<?php
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
$black = imagecolorallocate($im, 0, 0, 0);
for ($y = 0; $y < 512; $y++) {
for ($x = 0; $x < 512; $x++) {
if (rand(0, 1)) {
imagesetpixel($im, $x, $y, $white);
}
else{
imagesetpixel($im, $x, $y, $black);
}
}
}
imagepng($im); imagedestroy($im);
?>
此代码输出此图像,您可以看到它具有某种模式:
mt_rand() 函数给了我这个输出:
现在我的问题是,mt_rand() 真的那么可预测吗,与rand() 函数相比,它对我来说似乎很随机。
【问题讨论】:
-
在这种情况下,secure 是什么意思?你的意思是说价值无法预测?
-
这种方法比打印随机数10000次再统计要好得多。
-
rand和mt_rand都是 pseudo 随机数生成器,根据它们的定义,它们在某些情况下是可预测的(例如,你得到知道他们的种子或内部状态)。对于真正不可预测的随机数,您需要一个硬件生成器。维护由或多或少随机事件和/或实际硬件 RNG 推动的熵池的操作系统级实现比此类 PRNG 随机得多。
标签: php