JSFiddle - React, Tailwind, and code Playground

by XarX

HTML

<pre id=painted></pre>

JavaScript

var _painted = 0, $painted = document.getElementById('painted');

var attr = [8,8,8],
nextAttr = 9,
abilityPoints = 0,
success = 0,
runs = 100;


while (attr[0] < 15 || attr[1] < 15 || attr[2] < 15) {
	for (i=0;i<runs;i++) {
    var critical = [0,0],
    pointsLeft = abilityPoints;
    roll0 = Math.floor(Math.random()*20)+1;
    roll1 = Math.floor(Math.random()*20)+1;
    roll2 = Math.floor(Math.random()*20)+1;

    if (roll0 == 1) critical[0]++;
    else if (roll0 == 20) critical[1]++;
    if (roll1 == 1) critical[0]++;
    else if (roll1 == 20) critical[1]++;
    if (roll2 == 1) critical[0]++;
    else if (roll2 == 20) critical[1]++;

    if (roll0 <= attr[0]) {}
    else pointsLeft-=roll0-attr[0];
    if (roll1 <= attr[1]) {}
    else pointsLeft-=roll1-attr[1];
    if (roll2 <= attr[2]) {}
    else pointsLeft-=roll2-attr[2];

    if ((pointsLeft >= 0 || critical[0] >= 2) && critical[1] < 2) success+=1/runs;
  }
  for (j=0;j<3;j++)
  	if (attr[j] < nextAttr) { 
    	attr[j]++;
      break;
    }
	$painted.textContent+= attr[0] + "," + attr[1] + "," + attr[2] + " : " + cut(success) + "\n";
}
  
$painted.textContent+="\nDone!";

function cut(x) {
	var output = Math.floor(1000*x);
  if (output%1000 == 0) return output/1000 + ".000";
  else if (output%100 == 0) return output/1000 + "00";
  else if (output%10 == 0) return output/1000 + "0";
  else return output/1000;
}

function cutToPerc(x) {
	var output = Math.floor(100*x);
  if (output<10) return "0" + output + "%";
  else return output + "%";
}