Як працюють генератори випадкових чисел?


23

Я просто розмірковував над rand()функцією php і думав про те, як би я міг її переробити, і я прийшов зовсім ошелешений.

Як працюють генератори випадкових чисел?


2
Генератори псевдо випадкових чисел використовують насіння, таблицю заздалегідь визначених констант та математичні формули. Генератори реальних випадкових чисел зазвичай використовують атмосферний шум. Ви можете легко отримати випадкові числа з читання / dev / random.
праворуч

Чи гарантується, що атмосферний шум буде випадковим?


14
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Ніл

3
Хтось повинен це зробити: xkcd.com/221 ;)
Валера Колупаєв,

Відповіді:


7

Генератори випадкових чисел (RNG) справді генерують псевдовипадкові числа, оскільки неможливо насправді генерувати ПРАВИЛЬНЕ випадкове число. Єдині справді випадкові речі - це дії Божі, як блискавка.

Ця стаття у Вікіпедії може допомогти вам у поясненні: http://en.wikipedia.org/wiki/Random_number_generators


Як я розумію, в основному є дві частини RNG: насіння, а потім випадкове число, вибране з цього насіння. Коли ви посіяли RNG, ви даєте йому еквівалент початкової точки. Тоді ця відправна точка має купу чисел, які знаходяться "всередині", з яких програма вибирає. У PHP ви можете використовувати srand () для "перемішування" насіння, тому ви майже завжди отримуєте іншу відповідь. Потім ви можете використовувати rand (min, max), щоб перейти в насіння і вибрати число між min та max, включно.


ПОПЕРЕДЖЕННЯ, МОЖЛИВА АНАЛОГІЯ СИСТЕМИ НАПЕРЕД!

Подумайте про кожне «насіння» як крижану скриню, а потім випадкові числа як кубики льоду. Скажімо, у вас 1000 комодів з льодом, і кожна скриня має 1000 кубиків льоду всередині. На окружному ярмарку вони оберуть крижану скриню, яку почнуть використовувати для напоїв, і вони можуть використовувати лише один кубик льоду. Однак їм потрібні лише кубики льоду, більший за 1 кубічний дюйм. Тож вони виберуть скриню навмання між цими 1000 скринями, а потім навмання виберуть кубик льоду всередині цієї скрині. Якщо він працює на потрібний розмір, вони використовують його. Якщо ні, вони кладуть її назад у груди з іншими. Якщо вони хочуть зробити це трохи веселіше, вони заздалегідь поміняють скрині для повного забуття, якщо ви хочете!

Щодо того, як PHP насправді фізично вибирає насіння та випадкове число, я не маю достатньо знань для цього (це, мабуть, те, про що ти найбільше цікавився!). Я б не намагався повторити функцію rand (); Для більшості веб-додатків, які ви будете робити, rand () має вистачити на будь-яке випадкове число, яке вам знадобиться.

Ознайомтесь також з лінійними конгруентними генераторами, це може бути більше того, що ви шукаєте, якщо вам потрібні брудні деталі: http://en.wikipedia.org/wiki/Linear_congrustven_generator

Сподіваюся, це допомагає!


7
Як би вчинки godбули випадковими як мінімум? Крім цього, блискавка також не є випадковою, вона слідує шляху, визначеному різними умовами. Також інтерпретатор, що генерує число, по суті не має значення.

7
Я використовую Божі вчинки в юридичному розумінні: en.wikipedia.org/wiki/Act_of_God Вони вважаються випадковими, оскільки вони перебувають поза очевидним людським контролем.

4
Отже, по суті, немає нічого випадкового. Але це вимагає впливу на кожен, здавалося б, випадковий випадок, який не спрацьовує, коли ви потрапите на самий початок часу .... Схоже, я збираюся взяти деякі уроки філософії = D

6
@Корвін, наскільки нам відомо, квантові явища, такі як радіоактивний розпад, або викид фотона збудженим атомом справді випадкові. Однак математики та філософи стверджують, що означає бути справді випадковим. І хоча звичайні люди вважають, що кидання монети є досить випадковим чином, спритні фокусники ( news.stanford.edu/pr/2004/diaconis-69.html ) можуть регулярно отримувати 10 голів на 10 оборотів.
Чарльз Е. Грант

1
@Charles - Кидок монети - це навіть не двійкові голови / хвости, це насправді голови / хвости / краю, тому дійсно хороший фокусник може змусити його спуститися ні головами, ні хвостами. * 8 ')
Марк Бут

18

Зазвичай вони не є справді випадковими, але їх називають псевдовипадковими, оскільки вони генерують числову послідовність, яка видається випадковою. Це робиться за допомогою декількох цікавих математичних формул. Один з найпоширеніших - лінійний конгрурентний генератор .

Псевдовипадкові числа мають одне корисне властивість, якого не мають справжні випадкові числа: якщо ви будете використовувати одне насіння під час запуску, ви отримаєте назад однакову послідовність. Це може бути дуже зручно для тестування.


Якщо я правильно розумію ваше друге твердження: random(5332)завжди буде рівним random(5332)?

2
@ Корвін, я не маю на увазі, якщо ви телефонуєте, srand(5332)то наступний номер, який повертається, randзавжди буде однаковим.
Марк Рансом

3
"з'являється випадковим" -> мають ті ж статистичні властивості, що і справді випадкові числа.

+1 для посилання на Вікіпедію LGC, це чудова анімація того, чому спрощені PRNG мають серйозні обмеження під час багатомодерного моделювання Монте-Карло.
Марк Бут

4

Ви запитуєте псевдовипадкові чи випадкові? Інші відповіли про псевдовипадкові, дозвольте мені поговорити про Random.

У продажу були (є?) Фактичні апаратні генератори випадкових чисел. Вони базувалися на мікросхемі з невеликим радіовимірюванням білого шуму глибокого космічного випромінювання або невеликим радіоактивним зразком та періодами вимірювання між його розпадом. Проблемою з ними була пропускна здатність - кількість ентропії, яку вони могли генерувати, була не дуже високою, тому їх використовували для насіння алгоритмів псевдовипадкових. Вони використовувались у банківських системах, підвищеній безпеці тощо.

ОТОХ, якщо ви зустрінете будь-якого розробника вбудованих систем, вони над цим посміяються. Для загальних цілей програмування мікроконтролера, зчитування низьких 4 біт будь-якого 16-розрядного аналогово-цифрового перетворювача з плаваючим (не з'єднаним) штифтом видасть ідеально хороший випадковий шум при більш ніж достатній пропускній здатності (чим коротший термін опитування, тим більше " галасливе "читання") і простіше, ніж писати фактичну процедуру RNG. Зважаючи на те, що АЦП зазвичай зустрічаються в силіконі мікроконтролерів, які зазвичай реалізуються і часто реалізуються з 8 каналів, з яких вам потрібно, можливо, 5 для вашого застосування, це практично безкоштовно.

І навіть якщо у вас немає АЦП, пара елементів, підключених до цифрового штифта GPIO, видаватиме непоганий шум. Вбудований шум постійно присутній (і постійно бореться), і тому отримати справжню випадковість дуже просто.


2

Існує багато способів спробувати наслідувати "випадкову" послідовність чисел. Ваша перша зупинка повинна бути, щоб прочитати про лінійні конгруентні генератори точно. Ось як працює більшість генераторів випадкових чисел, і я б обзавівся, як працює функція rand () PHP.

Наступним цікавішим питанням для роздумів є те, як воно посідає себе? час? IP-адреса? тощо.


Насіння - це те, що мене бентежить, я не можу придумати нічого, що могло б заробити функцію без якоїсь схеми, і навіть якщо ні, то що змушує спершу генерувати випадкове насіння!

3
Я вважаю, що часова марка часто використовується як початкове насіння, коли жодне фактично не надається з якогось іншого джерела. У старих BASIC це RANDOMIZE TIMERбула загальна ідіома і "досить хороша" для більшості (не криптографічних) цілей. За словами людини 3 , бібліотека GNU C використовує фіксований насінь до 1, поки PRNG не буде перероблений.
CVn

1

Перш за все, практично всі rand()функції не забезпечують справжньої випадковості, скоріше вони забезпечують так звані псевдовипадкові числа.

Отже, як працюють генератори псевдовипадкових чисел? В основному так само, як працює шифрування: у вас є функція (хеш), яка приймає якийсь вхід і виробляє деякий вихід таким складним чином, що неможливо з виводу здогадатися про вхід або навпаки. Тобто, кожен цифер може бути використаний для створення досить хорошого псевдовипадкового генератора. Однак, хоча ви можете використовувати будь-який псевдовипадковий генератор для шифрування в принципі, більшість генераторів псевдовипадкових чисел в основному розробляються для швидкості, а не криптографічної безпеки, тому вони не дадуть хакерам ніяких головних болів.

Для псевдовипадкового генератора функція хешування застосовується до деякого прихованого внутрішнього стану генератора, а його вихід використовується для: a) зміни цього внутрішнього стану та b) для обчислення виходу rand()функції. Наступна виклик rand()буде використовувати той змінений внутрішній стан і, таким чином, давати інший результат. Чим краще хеш-функція, тим менш легко можна відрізнити результати від справжніх випадкових чисел.


Насправді, комп’ютери в наш час мають доступ до реальних випадкових чисел: вони випливають з тремтіння в часі переривань, викликаних зовнішніми пристроями. Linux використовує ці значення малої невизначеності, щоб постійно перемішувати "пул ентропії", який становить лише кілька кілобайт внутрішнього стану. Криптографічні хеші на основі цього пулу ентропії доступні через пристрої /dev/randomта /dev/urandomпристрої. Отже, доступ до деяких дійсно хороших випадкових чисел такий же простий, як відкрити один з цих двох пристроїв і прочитати з них кілька байт.


-2

Випадкові числа - це числа, що генеруються процесом, вихід якого непередбачуваний. тобто ми не можемо сказати, що буде наступним результатом. Ми можемо взяти простий приклад результату кістки. Що вийде, коли ми кинемо кістки, непередбачувано.

Існує два типи випадкових чисел 1. Справжні випадкові числа 2. Псевдо випадкові числа.

Як генеруються випадкові числа


1
Будь ласка, використовуйте форматування цитат, щоб виділити, які частини відповіді є вашими, а які - з джерела, яке ви цитуєте. Якщо уся ваша відповідь - це копія / вставка із зовнішнього джерела, тут це не гарна відповідь.
Мат

це, здається, не пропонує нічого суттєвого щодо пунктів, викладених та пояснених у попередніх 6 відповідях
гнат
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.