Я согласен с более ранними ответами, что реальная случайность в небольших сериях некоторых игр нежелательна - она кажется слишком несправедливой для некоторых случаев использования.
Я написал простую реализацию типа Shuffle Bag в Ruby и провел некоторое тестирование. Реализация сделала это:
- Если это все еще кажется справедливым или мы не достигли порога минимальных бросков, он возвращает справедливое попадание, основанное на нормальной вероятности.
- Если наблюдаемая вероятность от прошлых бросков заставляет ее казаться несправедливой, она возвращает "справедливо бросающий вызов".
Это считается несправедливым на основе граничных вероятностей. Например, для вероятности 20% вы можете установить 10% в качестве нижней границы и 40% в качестве верхней границы.
Используя эти границы, я обнаружил, что при прогонах из 10 хитов 14,2% времени истинная псевдослучайная реализация давала результаты, выходящие за эти границы . Приблизительно в 11% случаев 0 критических попаданий были забиты в 10 попытках. В 3,3% случаев 5 или более критических попаданий попадали из 10. Естественно, с использованием этого алгоритма (с минимальным количеством бросков 5) гораздо меньшее количество (0,03%) «честных» пробежек выходило за пределы , Даже если приведенная ниже реализация непригодна (конечно, можно делать более умные вещи), стоит отметить, что очень часто ваши пользователи будут чувствовать, что это несправедливо по отношению к реальному псевдослучайному решению.
Вот мясо моего FairishBag
, написанного на Ruby. Полная реализация и быстрая симуляция Монте-Карло доступна здесь (gist) .
def fire!
hit = if @rolls >= @min_rolls && observed_probability > @unfair_high
false
elsif @rolls >= @min_rolls && observed_probability < @unfair_low
true
else
rand <= @probability
end
@hits += 1 if hit
@rolls += 1
return hit
end
def observed_probability
@hits.to_f / @rolls
end
Обновление: Использование этого метода увеличивает общую вероятность получения критического удара примерно до 22% с использованием указанных выше границ. Вы можете компенсировать это, установив его «реальную» вероятность чуть ниже. Вероятность 17,5% с честной модификацией дает наблюдаемую долгосрочную вероятность около 20% и сохраняет краткосрочные пробежки в хорошем настроении.