1d12 vs 2d6 vs 3d4

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 _1d12_chance = 1 / 12;
const _2d6_chance = 1 / 6 ** 2;
const _3d4_chance = 1 / 4 ** 3;

const _1d12_array = new Array(12).fill(_1d12_chance);
const _2d6_array = new Array(12).fill(0);
const _3d4_array = new Array(12).fill(0);

// 2d6
for (let i = 1; i <= 6; i++) {
	for (let k = 1; k <= 6; k++) {
		_2d6_array[i + k - 1] += _2d6_chance;
	}
}

// 3d4
for (let i = 1; i <= 4; i++) {
	for (let k = 1; k <= 4; k++) {
		for (let j = 1; j <= 4; j++) {
			_3d4_array[i + k + j - 1] += _3d4_chance;
		}
	}
}

let _1d12_sum = 0;
let _2d6_sum = 0;
let _3d4_sum = 0;

for (let i = 1; i <= 12; i++) {
	_1d12_sum += i * _1d12_array[i - 1];
	_2d6_sum += i * _2d6_array[i - 1];
	_3d4_sum += i * _3d4_array[i - 1];
	if (_1d12_array[i - 1] === 0) _1d12_array[i - 1] = null;
	if (_2d6_array[i - 1] === 0) _2d6_array[i - 1] = null;
	if (_3d4_array[i - 1] === 0) _3d4_array[i - 1] = null;
}

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

new Chart('chart', {
	type   : 'line',
	data   : {
		labels  : [...new Array(12)].map((_, i) => i + 1),
		datasets: [
			{
				label      : label(`1d12`, _1d12_chance, _1d12_sum),
				data       : _1d12_array,
				borderColor: 'rgb(0, 255, 0)'
			},
			{
				label      : label(`2d6`, _2d6_chance, _2d6_sum),
				data       : _2d6_array,
				borderColor: 'rgb(255, 0, 0)'
			},
			{
				label      : label(`3d4`, _3d4_chance, _3d4_sum),
				data       : _3d4_array,
				borderColor: 'rgb(0, 0, 255)',
        tension: .3
			}
		]
	},
	options: {
		elements: {
			point: {
				radius: 8
			},
		},
		datasets: {
			line: {
				borderJoinStyle: `round`,
				spanGaps       : true
			}
		},
		scales  : {
			y: {
				beginAtZero: true
			}
		}
	}
});