Почему rand () не является случайным?

Я хотел поставить случайные точки На изображении (звезды в космосе для какого-то забавного побочного проекта)

у меня есть этот простой скрипт.

<?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 цикл, поэтому он показывает шаблон, который я заметил. У нас есть 1 миллион пикселей для использования, все еще случайные X и Y создают этот шаблон: enter image description here

Так что это далеко не случайным. Я знаю, что Рэнд не случайным, поэтому не годится для криптографии. Но я не нахожу информации о том, как это работает и что я должен делать, чтобы избежать таких шаблонов.

1 ответов


линейные конгруэнтные генераторы случайных чисел (это то, что PHP rand uses) всегда будет отображать эффекты автокорреляции на графике x-y.

вы будете иметь лучшие результаты с mt_rand. Это генератор вихря Мерсенна.