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

Posted

技术标签:

【中文标题】为啥 rand() 不是真正随机的?【英文标题】:Why rand() isn't really random?为什么 rand() 不是真正随机的? 【发布时间】:2015-07-28 11:42:35 【问题描述】:

我想在图像上放置随机点(空间中的星星用于一些有趣的小项目)

我有这个简单的脚本。

<?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 创建这种模式:

所以它远非随机。我知道 rand 不是真正的随机数,这就是为什么它不适合密码学。但我没有找到关于它是如何工作的信息以及我应该怎么做才能避免这样的模式。

【问题讨论】:

【参考方案1】:

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

使用mt_rand,您将获得更好的结果。这是一个 Mersenne Twister 发生器。

【讨论】:

感谢您搜索的关键字。真的很有帮助。总的来说,我对 PHP 和编程了解很多,但我大多是自学过的,所以我缺乏一些技术术语。我会尽快接受。 而 mt_rand 确实可以胜任。它似乎是随机的,每次运行时都会发生变化。 i.imgur.com/DoeNFB9.png再次感谢您。【参考方案2】:

请放心:从 PHP 7.1.0 开始,rand() 使用与 mt_rand() 相同的随机数生成器。

这只是 PHP see the Docs 的问题

【讨论】:

令人难以置信的是,将近 5 年之后,我仍然收到有关此问题的通知,甚至还有像这样有意义的通知。

以上是关于为啥 rand() 不是真正随机的?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver 中rand()是产生随机数,为啥还要设置种子?

为啥分叉后 rand() 不那么随机?

为啥我总是用 rand() 得到相同的随机数序列?

为啥我总是用 rand() 得到相同的随机数序列?

函数RAND啥意思

关于PHP中array_rand函数为啥不能只设置一个随机?