为啥 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() 不是真正随机的?的主要内容,如果未能解决你的问题,请参考以下文章