如果我使用:生成一个数字$num=rand(0, 1000);,是否可以猜测下一个数字是什么?
我需要记录一定数量的先前生成的数字吗?我将如何计算下一个数字?
附加信息:
从random.org -
PHP Rand()图片
真实随机图像
感谢Derobert的回答:
我用他的答案中张贴的方法生成以下图像
OpenSSL映像
我使用以下代码执行此操作:
// Requires the GD Library
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512)
or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for ($y=0; $y<512; $y++) {
for ($x=0; $x<512; $x++) {
if (random() === 1) {
imagesetpixel($im, $x, $y, $white);
}
}
}
imagepng($im);
imagedestroy($im);
function random(){
$num = unpack('L', openssl_random_pseudo_bytes(4, $is_strong));
if (!$is_strong) {
echo 'error';
}
else{
$lastDigit=substr($num[1], strlen($num[1])-1, 1);
if($lastDigit<=4) return 0;
return 1;
}
}
Run Code Online (Sandbox Code Playgroud)
学分博
是的,有可能,php rand显然只是使用底层C库的rand,它是一个伪随机数生成器。
您需要观察多少输出取决于C库使用的确切算法,该算法因平台而异(有时甚至因版本而异)。您需要观察者输出的数量可能少于十个。
如果您的C库特别糟糕,则可以尝试mt_rand使用Mersenne Twister算法。请注意,这仍然是可以预测的。
如果您需要不可预测的随机数,请在使用后openssl_random_pseudo_bytes确保crypto_strong为真。注意,它返回一个二进制字符串。要获得一个数字,您将必须使用类似unpack:
$num = unpack('L', openssl_random_bytes(4, $is_strong));
if (!$is_strong) {
... // handle error
}
Run Code Online (Sandbox Code Playgroud)
另外请注意,它将返回0到2³²= 4294967296之间的数字,而不是0–1000,因此您需要处理该数字。