Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP Rand(),是否可以猜测序列中的下一个数字?以及生成更好的数字_Php_Random - Fatal编程技术网

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