1d20 vs 10d2

by nazarpunk

HTML

<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/3.5.1/chart.min.js"></script>
<canvas id="chart"></canvas>

JavaScript

const _1d20_chance = 1 / 12;
const _10d2_chance = 1 / 2 ** 10;

const _1d20_array = new Array(20).fill(_1d20_chance);
const _10d2_array = new Array(20).fill(0);

for (let _1 = 1; _1 <= 2; _1++) {
  for (let _2 = 1; _2 <= 2; _2++) {
    for (let _3 = 1; _3 <= 2; _3++) {
      for (let _4 = 1; _4 <= 2; _4++) {
        for (let _5 = 1; _5 <= 2; _5++) {
          for (let _6 = 1; _6 <= 2; _6++) {
            for (let _7 = 1; _7 <= 2; _7++) {
              for (let _8 = 1; _8 <= 2; _8++) {
                for (let _9 = 1; _9 <= 2; _9++) {
                  for (let _10 = 1; _10 <= 2; _10++) {
                    _10d2_array[_1 + _2 + _3 + _4 + _5 + _6 + _7 + _8 + _9 + _10 - 1] += _10d2_chance;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}

let _1d20_sum = 0;
let _10d2_sum = 0;

for (let i = 1; i <= 12; i++) {
  _1d20_sum += i * _1d20_array[i - 1];
  _10d2_sum += i * _10d2_array[i - 1];
  if (_1d20_array[i - 1] === 0) _1d20_array[i - 1] = null;
  if (_10d2_array[i - 1] === 0) _10d2_array[i - 1] = null;
}

const label = (dice, chance, sum) => `${dice} шанс: ${chance.toFixed(3)}, средний дайс: ${sum.toFixed(2)}`;

new Chart('chart', {
  type: 'line',
  data: {
    labels: [...new Array(20)].map((_, i) => i + 1),
    datasets: [{
        label: label(`1d20`, _1d20_chance, _1d20_sum),
        data: _1d20_array,
        borderColor: 'rgb(0, 255, 0)'
      },
      {
        label: label(`10d2`, _10d2_chance, _10d2_sum),
        data: _10d2_array,
        borderColor: 'rgb(255, 0, 0)',
        tension: .4
      },
    ]
  },
  options: {
    elements: {
      point: {
        radius: 8
      },
    },
    datasets: {
      line: {
        borderJoinStyle: `round`,
        spanGaps: true
      }
    },
    scales: {
      y: {
        beginAtZero: true
      }
    }
  }
});