fork download
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.Random;
  4.  
  5. class CriticalHit {
  6. public static void main(String[] args) {
  7. class Combo {
  8. int d;
  9. int hp;
  10. public Combo(int d, int hp) {
  11. this.d = d;
  12. this.hp = hp;
  13. }
  14. public int getD() {
  15. return d;
  16. }
  17. public int getHp() {
  18. return hp;
  19. }
  20. }
  21.  
  22. List input = new ArrayList<Combo>();
  23.  
  24. input.add(new Combo(4, 1));
  25. input.add(new Combo(4, 4));
  26. input.add(new Combo(4, 5));
  27. input.add(new Combo(4, 6));
  28. input.add(new Combo(1, 10));
  29. input.add(new Combo(100, 200));
  30. input.add(new Combo(8, 20));
  31.  
  32. input.forEach(s -> System.out.println(String.format("d: %d\thp: %d\tprobability: %8f\tdamage: %d",
  33. ((Combo) s).getD(),
  34. ((Combo) s).getHp(),
  35. CriticalHit.getCritChance(((Combo) s).getD(), ((Combo) s).getHp()),
  36. CriticalHit.getCrit(((Combo) s).getD()))));
  37. }
  38.  
  39. public static int getCrit(double d) {
  40. int maxCrit = 0;
  41. if (d != 1) {
  42. Random r = new Random();
  43. maxCrit = 1 + r.nextInt((int) d);
  44. if (maxCrit == d)
  45. maxCrit += getCrit(d);
  46. }
  47. return maxCrit;
  48. }
  49.  
  50. public static double getCritChance(double d, int hp) {
  51. int exponent = (int) (hp / d);
  52. int rest = (int) (hp % d);
  53.  
  54. double chance = Math.pow(1 / d, exponent);
  55. if (rest > 0)
  56. chance *= (d - rest + 1) / d;
  57.  
  58. return chance;
  59. }
  60. }
Success #stdin #stdout 0.22s 320832KB
stdin
Standard input is empty
stdout
d: 4	hp: 1	probability: 1.000000	damage: 3
d: 4	hp: 4	probability: 0.250000	damage: 5
d: 4	hp: 5	probability: 0.250000	damage: 3
d: 4	hp: 6	probability: 0.187500	damage: 5
d: 1	hp: 10	probability: 1.000000	damage: 0
d: 100	hp: 200	probability: 0.000100	damage: 45
d: 8	hp: 20	probability: 0.009766	damage: 3