Почему 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 создают этот шаблон: введите здесь описание изображения

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


person Ákos Nikházy    schedule 28.07.2015    source источник


Ответы (2)


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

У вас будут лучшие результаты с mt_rand. Это генератор Mersenne Twister.

person Bathsheba    schedule 28.07.2015
comment
Спасибо за ключевые слова, которые я ищу. Действительно помогает. Я много знаю о PHP и программировании в целом, но в основном я жесткий самоучка, поэтому мне не хватает некоторых технических терминов. Я приму это как можно скорее. - person Ákos Nikházy; 28.07.2015
comment
И mt_rand действительно справляется со своей задачей. Это кажется случайным и меняется каждый раз, когда я его запускаю. i.imgur.com/DoeNFB9.png Еще раз спасибо. - person Ákos Nikházy; 28.07.2015

Будьте уверены: начиная с PHP 7.1.0, rand() использует тот же генератор случайных чисел, что и mt_rand().

Это проблема только для PHP ‹ 7.1 см. документацию

person theking2    schedule 24.01.2020
comment
Невероятно, что спустя почти 5 лет я все еще получаю уведомления об этом вопросе, и даже такие содержательные, как это. - person Ákos Nikházy; 27.01.2020