Элементарную вещь расскажу, наверное, многие знают. Но в одной теме недавно зашла речь о генераторе случайных чисел в мейкере, и о том, что он может быть «нечестным». Не залезая в код мейкера, просто расскажу, как может на самом деле работать вероятность, и как можно сделать её более «честной».
Итак, предположим, у нас есть событие, которое должно наступать с вероятностью 1/3, то есть, мы ожидаем, что примерно один раз из трёх попыток, это событие будет происходить. При этом нас будет напрягать, если мы делаем вот уже шестую попытку, а событие так и не произошло, либо случается вот уже четвёртый раз подряд. Тем не менее, при действительно случайном распределении такое возможно.
Вот, я сгенерировал пару рядов случайных чисел, и показал, как там распределяются тройки. Видите, есть совсем пустые области, а есть те, где они лежат прямо кучей:
Разумеется, в большой выборке событие действительно будет иметь место в 1/3 случаев, однако игрок обычно держит в уме очень небольшую выборку, и его такие периоды «невезения» или «сверхудачи» будут раздражать.
Подобного можно избежать, если использовать чуть более сложную модель наступления события. Вместо проверки: «если случайное число от 1 до 3 равно 3, то событие наступает», мы сделаем так: «событие наступает через 1-5 попыток». Это даст ту же вероятность в 1/3, однако сделает распределение более равномерным.
В программе это будет выглядеть, например, так:
Но даже в этом случае возможны ситуации, когда событие будет повторяться по многу раз подряд, либо происходить слишком редко (да, вероятность эта будет гораздо меньше, но всё равно может случиться). Для этого код можно ещё усложнить, сделав невозможным повтор события больше двух раз подряд, а заодно сделаем невозможным и возникновение подряд больших промежутков между событиями:
Вот для примера ряд случайных промежутков и то, как распределились в нём события: