为什么rand()不是真正随机的?

问题描述 投票:7回答:2

我想在图像上放置随机点(星星在太空中进行一些有趣的辅助项目)

我有这个简单的脚本。

<?php
$gd = imagecreatetruecolor(1000, 1000);
$white = imagecolorallocate($gd, 255, 255, 255);

for ($i = 0; $i < 100000; $i++) 
{
    $x = rand(1,1000);
    $y = rand(1,1000);

    imagesetpixel($gd, round($x),round($y), $white);
}

header('Content-Type: image/png');
imagepng($gd);
?>

请记住,这只是为了测试,这就是为什么我将100000放入for循环中的原因,因此它显示了我注意到的新兴模式。我们有100万个像素可以使用,仍然由X和Y随机创建此模式:enter image description here

所以它不是随机的。我知道兰德不是真正的随机数,这就是为什么它不适用于密码学。但是我找不到有关它如何工作以及如何避免这种模式的信息。

php random gd
2个回答
10
投票

线性同余随机数生成器(PHP rand使用的线性生成器将始终在x-y图上显示自相关效果。

使用mt_rand您将获得更好的结果。这是Mersenne Twister生成器。


1
投票

放心:自PHP 7.1.0起,rand()使用与mt_rand()相同的随机数生成器。

这仅是PHP <7.1 see the Docs的问题

© www.soinside.com 2019 - 2024. All rights reserved.