Я просто розмірковував над rand()
функцією php і думав про те, як би я міг її переробити, і я прийшов зовсім ошелешений.
Як працюють генератори випадкових чисел?
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Я просто розмірковував над rand()
функцією php і думав про те, як би я міг її переробити, і я прийшов зовсім ошелешений.
Як працюють генератори випадкових чисел?
function rand() { return 4; /* determined by die roll - guaranteed to be random */ }
Відповіді:
Генератори випадкових чисел (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
Сподіваюся, це допомагає!
god
були випадковими як мінімум? Крім цього, блискавка також не є випадковою, вона слідує шляху, визначеному різними умовами. Також інтерпретатор, що генерує число, по суті не має значення.
Зазвичай вони не є справді випадковими, але їх називають псевдовипадковими, оскільки вони генерують числову послідовність, яка видається випадковою. Це робиться за допомогою декількох цікавих математичних формул. Один з найпоширеніших - лінійний конгрурентний генератор .
Псевдовипадкові числа мають одне корисне властивість, якого не мають справжні випадкові числа: якщо ви будете використовувати одне насіння під час запуску, ви отримаєте назад однакову послідовність. Це може бути дуже зручно для тестування.
srand(5332)
то наступний номер, який повертається, rand
завжди буде однаковим.
Ви запитуєте псевдовипадкові чи випадкові? Інші відповіли про псевдовипадкові, дозвольте мені поговорити про Random.
У продажу були (є?) Фактичні апаратні генератори випадкових чисел. Вони базувалися на мікросхемі з невеликим радіовимірюванням білого шуму глибокого космічного випромінювання або невеликим радіоактивним зразком та періодами вимірювання між його розпадом. Проблемою з ними була пропускна здатність - кількість ентропії, яку вони могли генерувати, була не дуже високою, тому їх використовували для насіння алгоритмів псевдовипадкових. Вони використовувались у банківських системах, підвищеній безпеці тощо.
ОТОХ, якщо ви зустрінете будь-якого розробника вбудованих систем, вони над цим посміяються. Для загальних цілей програмування мікроконтролера, зчитування низьких 4 біт будь-якого 16-розрядного аналогово-цифрового перетворювача з плаваючим (не з'єднаним) штифтом видасть ідеально хороший випадковий шум при більш ніж достатній пропускній здатності (чим коротший термін опитування, тим більше " галасливе "читання") і простіше, ніж писати фактичну процедуру RNG. Зважаючи на те, що АЦП зазвичай зустрічаються в силіконі мікроконтролерів, які зазвичай реалізуються і часто реалізуються з 8 каналів, з яких вам потрібно, можливо, 5 для вашого застосування, це практично безкоштовно.
І навіть якщо у вас немає АЦП, пара елементів, підключених до цифрового штифта GPIO, видаватиме непоганий шум. Вбудований шум постійно присутній (і постійно бореться), і тому отримати справжню випадковість дуже просто.
Існує багато способів спробувати наслідувати "випадкову" послідовність чисел. Ваша перша зупинка повинна бути, щоб прочитати про лінійні конгруентні генератори точно. Ось як працює більшість генераторів випадкових чисел, і я б обзавівся, як працює функція rand () PHP.
Наступним цікавішим питанням для роздумів є те, як воно посідає себе? час? IP-адреса? тощо.
RANDOMIZE TIMER
була загальна ідіома і "досить хороша" для більшості (не криптографічних) цілей. За словами людини 3 , бібліотека GNU C використовує фіксований насінь до 1, поки PRNG не буде перероблений.
Перш за все, практично всі rand()
функції не забезпечують справжньої випадковості, скоріше вони забезпечують так звані псевдовипадкові числа.
Отже, як працюють генератори псевдовипадкових чисел? В основному так само, як працює шифрування: у вас є функція (хеш), яка приймає якийсь вхід і виробляє деякий вихід таким складним чином, що неможливо з виводу здогадатися про вхід або навпаки. Тобто, кожен цифер може бути використаний для створення досить хорошого псевдовипадкового генератора. Однак, хоча ви можете використовувати будь-який псевдовипадковий генератор для шифрування в принципі, більшість генераторів псевдовипадкових чисел в основному розробляються для швидкості, а не криптографічної безпеки, тому вони не дадуть хакерам ніяких головних болів.
Для псевдовипадкового генератора функція хешування застосовується до деякого прихованого внутрішнього стану генератора, а його вихід використовується для: a) зміни цього внутрішнього стану та b) для обчислення виходу rand()
функції. Наступна виклик rand()
буде використовувати той змінений внутрішній стан і, таким чином, давати інший результат. Чим краще хеш-функція, тим менш легко можна відрізнити результати від справжніх випадкових чисел.
Насправді, комп’ютери в наш час мають доступ до реальних випадкових чисел: вони випливають з тремтіння в часі переривань, викликаних зовнішніми пристроями. Linux використовує ці значення малої невизначеності, щоб постійно перемішувати "пул ентропії", який становить лише кілька кілобайт внутрішнього стану. Криптографічні хеші на основі цього пулу ентропії доступні через пристрої /dev/random
та /dev/urandom
пристрої. Отже, доступ до деяких дійсно хороших випадкових чисел такий же простий, як відкрити один з цих двох пристроїв і прочитати з них кілька байт.
Випадкові числа - це числа, що генеруються процесом, вихід якого непередбачуваний. тобто ми не можемо сказати, що буде наступним результатом. Ми можемо взяти простий приклад результату кістки. Що вийде, коли ми кинемо кістки, непередбачувано.
Існує два типи випадкових чисел 1. Справжні випадкові числа 2. Псевдо випадкові числа.