Почему компьютер не умеет генерировать случайные числа или почему компьютерный рандом называют "псевдослучайным"?
Всем привет! Решил немного рассказать про "рандом" (генерацию случайности) в компьютерных программах и играх.
Если вас попросить загадать случайное число в диапазоне от и до, то по видимому вы действительно выпалите первое что придет вам в голову, или второе что придёт, но в любом случае результат будет случайным и по большей части не предсказуемым.
С компьютером всё не так, компьютер не может в случайности, машина выполняет программу, у машины всё чётко, либо 0 либо 1, либо true либо false. Чего то третьего не дано, не может ни каких "может быть", "наверно" и т.д. Но тем не менее каким то образом по большей части в играх программа как то генерирует случайные числа? Если не ходить далеко то взять "броски кубика" в Baldurs Gate 3, как это происходит?
Всё просто! Генерация случайного числа, не случайна, это тоже программа! Самая простейшая программа по генерации случайных чисел, для получения момента случайности использует миллисекунды времени. По терминологии это называется "сид". (отправная точка-число для математической операции)
Грубо говоря если представить что вы нажали на кнопку "Бросить кубик", то программа в момент нажатия записывает в переменную значение миллисекунд в момент нажатия кнопки и произведя с этим числом не хитрые математические операции, выдает случайное число.

В приведенном коде выше, мы получаем текущее время, затем отделяем из него микросекунды, после чего приводим его к целому числу, так как оно в системе является изначально дробным. Далее операция % 100 возвращает остаток от деления на 100, что дает число в диапазоне от 0 до 99 к которому в конечном итоге мы добавляем +1 и получаем от 1 до 100!
Благодаря такой функции например можно рассчитывать вероятность выпадения предметов в игре. Если вам нужно что бы предмет падал с вероятностью в 10% то вы генерируете вышеприведенным образом случайное число и проверяете
if ($случайное <= 10) - "случайное число меньше или равно 10ти" и если условие выполнено то предмет добавляется персонажу.
Однако всё это приведено просто для примера, на самом деле в любом языке программирования, всегда есть встроенная готовая функция генерации случайного числа, при этом алгоритм генерации там ещё хитрей! Например стоят защиты от повторений, битовые сдвиги и побитовые операции и т.д. Но если упростить то всё сведется примерно тому что я показал выше.
Именно по этому нельзя назвать такую генерацию "случайной" так как в теории зная точный момент запуска генератора и его алгоритм, можно просчитать что он выдаст! С этим к слову связан один забавный случай: https://habr.com/ru/news/818415/
Вкратце: Чувак сгенерировал пароль для криптокошелька с биткойнами через генератор паролей, и по классике прошляпил пароль. Обратился к белому хакеру, который определил что генератор который он использовал генерирует случайный пароль на основе даты на ПК пользователя, откатив дату на нужное время, он начал генерировать пароли, и пробовать их, в итоге получилось подобрать верный пароль!
Когда я ради интереса делал одну мини-игрульку, очень примитивную и глупую, в ней механика поиска предметов и механика "случайных встреч" была построена как раз на случайности, много предметов и шанс выпадения высчитывается случайно. Я очень удивился тому что предметы и встречи с низким шансом выпадения начали выпадать на много чаще чем им был заявлен шанс в скрипте! Связано это было как раз с тем что генератор случайных чисел внутри компьютера, может работать не просто не случайно, а порой с довольно сильной погрешностью. Результат статистики 100 бросков 6тигранного кубика в реальной жизни, может отличаться от тех же "бросков" посредством программы. Из-за чего порой разработчики игры вынуждены по мимо всего, из "псевдослучайного числа" делать за счет "подкрутки" ещё и "псевдослучайный шанс".
Например нечто подобное есть в играх fallout 1-2 когда персонаж мажет по врагу 4 раза подряд при 75+ вероятности попадания!
На этом у меня всё, прошу прощения за возможные ошибки, надеюсь вам было интересно!
Комментарии