OP
В значительной степени, если вы хотите, чтобы это было честно, оно не будет случайным.
Проблема вашей игры - фактическая длина матча. Чем дольше совпадение, тем меньше случайности вы увидите (криты будут составлять 20%), и это приблизится к вашим предполагаемым значениям.
У вас есть два варианта, предварительно рассчитать атаки на основе предыдущих бросков. Который вы будете получать один крит каждые 5 атак (на основе ваших 20%), но вы можете сделать порядок, он происходит случайно.
listOfFollowingAttacks = {Хит, Хит, Хит, Хит, Мисс, Крит};
Это шаблон, который вы хотите. Поэтому заставьте его выбирать случайным образом из этого списка, пока он не станет пустым, и создайте его заново.
Это паттерн, который я создал для своей игры, он работает достаточно хорошо для того, что я хочу, чтобы он делал.
ваш второй вариант - увеличить шанс критического удара, вы, вероятно, увидите более четное число в конце всех атак (при условии, что ваши матчи заканчиваются довольно быстро). Чем меньше шанс, тем больше RNG вы получите.