PHP Rand(),是否可以猜测序列中的下一个数字?以及生成更好的数字
如果我使用以下命令生成一个数字:PHP Rand(),是否可以猜测序列中的下一个数字?以及生成更好的数字,php,random,Php,Random,如果我使用以下命令生成一个数字:$num=rand(0,1000),是否可以猜出下一个数字 我是否需要记录以前生成的特定数量的数字?我该如何计算出下一个数字呢 其他信息: 从- PHP Rand()图像 真随机图像 感谢Derobert的回答: 我使用他答案中的方法生成了下面的图片 OpenSSL映像 我使用以下代码来执行此操作: // Requires the GD Library header("Content-type: image/png"); $im = imagecreatetrue
$num=rand(0,1000)代码>,是否可以猜出下一个数字
我是否需要记录以前生成的特定数量的数字?我该如何计算出下一个数字呢
其他信息:
从-
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;
}
}
//需要GD库
标题(“内容类型:图像/png”);
$im=ImageCreateTureColor(512,512)
或死亡(“无法初始化新的GD图像流”);
$white=imagecolorallocate($im,255,255,255);
对于($y=0;$yPHP将为同一种子生成相同的数字序列。因此,您必须找出种子,然后记录数字:
php > srand(1);
php > echo rand(1,100);
85
php > echo rand(1,100);
40
php > srand(1);
php > echo rand(1,100);
85
php > echo rand(1,100);
40
或者看看PHP源代码!是的,这是可能的,PHP的rand
显然只是使用底层C库的rand,它是一个伪随机数生成器
您需要观察多少输出取决于C库使用的精确算法,不同平台(有时甚至不同版本)的算法不同。您需要观察的输出数量可能不到十个
如果您的C库特别糟糕,您可以尝试使用该算法的mt_rand
。请注意,这仍然是可以预测的
如果需要不可预测的随机数,请使用并确保加密后为真。请注意,它返回一个二进制字符串;要获得一个数字,您必须使用类似于解包
:
$num = unpack('L', openssl_random_bytes(4, $is_strong));
if (!$is_strong) {
... // handle error
}
还请注意,它将返回一个介于0和2之间的数字,即=4294967296,而不是0–1000,因此您需要处理这个问题。rand()
生成一个伪随机序列。如果您想要一个可预测(读取可复制)序列,则需要使用srand()
对随机生成器进行种子设定
请尝试连续运行以下脚本两次:
<?php
$seed = 2;
srand($seed);
foreach(range(1, 100) as $i) var_dump(rand(0, 100));
0\u 0你知道,rand
是random
的缩写,对吧?是的,再次调用rand(0,1000)在实践中是不可能的,只是在理论上。@JackManey:看看我在random.org上发布和阅读的一些图片,rand()不是真正的随机性那么你的问题实际上是对随机性的伪装抱怨吗?还是你想要一个实际算法的反转函数+1,谢谢你的函数。我已经编辑了我的问题,并包含了一幅用你的函数生成的图像。@RichardLivingston:你的随机函数有偏差;请参阅如何操作(不过,在这种情况下,你可以只检查一个位,它是均匀划分的,所以你不需要循环和全部)。此外,当您只需要1位时,要求它提供4个字节是相当低效的。但对于快速和肮脏的代码,它会生成一个很好的图像:-P