Estou assumindo que esta é uma questão de equilíbrio do jogo e não uma questão de codificação, e há muitas maneiras de lidar com isso. Pelo seu algoritmo existente, suspeito que você o esteja tornando mais complicado do que deveria ser (três atributos E um número aleatório contribuem para um sistema extremamente confuso da perspectiva do jogador). Meu primeiro instinto é simplificar!
Favorecer atributos que fazem várias coisas, em vez de resultados determinados por vários atributos. DEX funciona muito bem como o principal determinante da chance de acertar; a adição de tudo o mais serve apenas para dificultar o equilíbrio. Pense da seguinte maneira: o dano esperado de um jogador em cada acerto é o% de acerto multiplicado pelo seu dano médio quando acerta. Como você planeja calcular um% esperado "típico" ou "típico" com tantas variáveis?
Vejo outro problema: sua fórmula não é escalável e é provavelmente isso que você está enfrentando. Supondo que DEX, LUCK e SPEED tendem a aumentar ao longo do jogo, as diferenças entre jogador e monstro nessas estatísticas também tendem a aumentar. Apenas como exemplo, se o DEX de um jogador no início do jogo estiver na faixa de 4 a 6 e os monstros também, esse é um modificador de 10 a 20% para acertar. Se o intervalo for de 10 a 20 nas fases posteriores do jogo, isso significa um modificador de 100%.
Uma maneira de corrigir isso é manter as estatísticas corrigidas. Os intervalos de jogadores e monstros são os mesmos ao longo do jogo, e obter algo como +1 DEX é muito importante, extremamente raro e tratado como tal (se existir). Então sua fórmula funcionará bem durante todo o jogo, e você verá um jogador com a mesma chance de acertar o tempo todo.
Outra maneira é mudar o "10" codificado para escalar com o nível, então talvez seja "10 + nível de monstro" ou "10 + nível de masmorra" ou algo assim, o que causa um leve aumento de dificuldade à medida que o jogo avança, a menos que o jogador suba de nível suas estatísticas de acordo.
Uma terceira maneira, como já foi dito, é definir limites máximos para os% mais alto e mais baixo aceitável aceitável, e simplesmente dizer "se o valor calculado for menor que X, use X".
Por uma questão de completude, vou apontar que não existe uma lei absoluta que você DEVE incluir em primeiro lugar. Tomar uma ação em um jogo que é ineficaz não é particularmente divertido e não contribui realmente para a experiência, exceto em casos raros. Uma alternativa é deixar os jogadores SEMPRE baterem e mexerem com o alcance dos danos, para que às vezes causem muito menos danos que outros. Lembre-se de que sistemas complexos são mais divertidos para o designer do que para o jogador.