Защо 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);
?>

Имайте предвид, че това е само за тестване, затова поставих 100 000 в 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