Ниже перевод статьи Бо Аллена отсюда.
Однажды я наткнулся на Random.org, классный сервис генератора настоящих случайных чисел. Разница между генератором настоящих случайных чисел (ГНСЧ) и генератором псевдослучайных чисел (ГПСЧ) в том, что ГНСЧ использует непредсказуемые физические средства для генерации чисел (например шумы атмосферы), а ГПСЧ использует математические алгоритмы (полностью производимые компьютером). Об этом можно более подробно узнать на Random.org (англ.) и в Википедии (англ.).
Я тогда возился с Растровым Генератором и решил сам создать псевдослучайно сгенерированный растр для сравнения. И вы не поверите, первая же вещь, которую я попробовал, показала узор!
![Random bitmap based on atmospheric noise](https://habrastorage.org/r/w1560/storage2/927/06e/464/92706e46478df4040ec6e77061d0e2ae.png)
![Random bitmap based on PHP's rand() function in Windows](https://habrastorage.org/r/w1560/storage2/28c/f97/64b/28cf9764be295de25f72cc158d110375.png)
Ой! Не такой уж «случайный», а?
Немногие ГПСЧ создадут такой очевидный узор, как этот. Просто тут подобралась действительно плохая комбинация языка (PHP), операционной системы (Windows) и функции (
Вот код, который я использовал для генерации растров:
По сути, такие вещи не должны вас волновать с генератором настоящих случайных чисел, если только как-то не нарушена безопасность (действительно целая отдельная тема). Генераторы псевдослучайных чисел очень разнятся по качеству. Некоторые ужасны, некоторые выдающиеся, но никакие не являются настоящими.
Простой наглядный пример
Однажды я наткнулся на Random.org, классный сервис генератора настоящих случайных чисел. Разница между генератором настоящих случайных чисел (ГНСЧ) и генератором псевдослучайных чисел (ГПСЧ) в том, что ГНСЧ использует непредсказуемые физические средства для генерации чисел (например шумы атмосферы), а ГПСЧ использует математические алгоритмы (полностью производимые компьютером). Об этом можно более подробно узнать на Random.org (англ.) и в Википедии (англ.).
Я тогда возился с Растровым Генератором и решил сам создать псевдослучайно сгенерированный растр для сравнения. И вы не поверите, первая же вещь, которую я попробовал, показала узор!
Random.org
![Random bitmap based on atmospheric noise](https://habrastorage.org/storage2/927/06e/464/92706e46478df4040ec6e77061d0e2ae.png)
PHP rand() в Windows
![Random bitmap based on PHP's rand() function in Windows](https://habrastorage.org/storage2/28c/f97/64b/28cf9764be295de25f72cc158d110375.png)
Ой! Не такой уж «случайный», а?
Немногие ГПСЧ создадут такой очевидный узор, как этот. Просто тут подобралась действительно плохая комбинация языка (PHP), операционной системы (Windows) и функции (
rand()
). Я запустил тот же код в Линуксе и там не было такого очевидного узора. Я также запустил этот код снова в Windows, но теперь применил PHPшную функцию mt_rand()
, которая использует Вихрь Мерсенна для лучшей генерации случайного числа, и очевидного узора не было. Если вы хотите узнать больше о том, почему так происходит, прочитайте это (англ.).Вот код, который я использовал для генерации растров:
// Requires the GD Library
header("Content-type: image/png");
$im = imagecreatetruecolor(512, 512)
or die("Cannot Initialize new GD image stream");
$white = imagecolorallocate($im, 255, 255, 255);
for ($y=0; $y<512; $y++) {
for ($x=0; $x<512; $x++) {
if (rand(0,1) === 1) {
imagesetpixel($im, $x, $y, $white);
}
}
}
imagepng($im);
imagedestroy($im);
По сути, такие вещи не должны вас волновать с генератором настоящих случайных чисел, если только как-то не нарушена безопасность (действительно целая отдельная тема). Генераторы псевдослучайных чисел очень разнятся по качеству. Некоторые ужасны, некоторые выдающиеся, но никакие не являются настоящими.