PHP Rand(),是否可以猜测序列中的下一个数字?并产生更好的数字

Dra*_*cir 3 php random

如果我使用:生成一个数字$num=rand(0, 1000);,是否可以猜测下一个数字是什么?

我需要记录一定数量的先前生成的数字吗?我将如何计算下一个数字?

附加信息:

random.org -

PHP Rand()图片PHP Rand()图片

真实随机图像真实随机图像

感谢Derobert的回答:

我用他的答案中张贴的方法生成以下图像

openssl图像 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)

学分

der*_*ert 5

是的,有可能,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,因此您需要处理该数字。