JSFiddle - React, Tailwind, and code Playground

by Daedalus

HTML

<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
<div ng-app="dc_gen">
    <div ng-controller="dc">
        Minimum endurance:<input type="number" ng-model="model.minEnd" ng-change="averageDCs()" /><br />
        Maximum endurance:<input type="number" ng-model="model.maxEnd" ng-change="averageDCs()" /><br />
        Entrants:<input type="number" ng-model="model.entrants" ng-change="averageDCs()" /><br />
        Champion DC multiplier:<input type="number" step=".1" ng-model="model.champMult" ng-change="averageDCs()" /><br />
        <div ng-repeat="average in averages">
            <strong>Level:  </strong>{{average.level}}<br />
            <strong>Average roll:  </strong>d{{average.baseDie}}+{{average.bonus}}<br />
            <strong>Max roll:  </strong>{{average.maxRoll}}<br />
            <strong>Qualify DC:  </strong>{{average.qualify}}<br />
            <strong>Bronze DC:  </strong>{{average.bronze}}<br />
            <strong>Silver DC:  </strong>{{average.silver}}<br />
            <strong>Gold DC:  </strong>{{average.gold}}<br />
            <strong>Champion DC:  </strong>{{average.champ}}<br />
            <br />
            <br />
        </div>
    </div>
</div>

JavaScript

var dc_gen = angular.module('dc_gen', []).controller('dc', ['$scope', function ($scope) {
    var rand = function (min, max) {
        return Math.floor((Math.random() * max) + min);
    }

    var averageDCs = function (minEnd, maxEnd, entrants, champMult) {
        var minEnd = parseInt(minEnd, 10),
            maxEnd = parseInt(maxEnd, 10),
            entrants = parseInt(entrants, 10),
            champMult = parseFloat(champMult, 10);
        var averages = [];
        for (var level = 10; level <= 50; level = level + 10) {
            var average = 0;

            for (var i = 0; i < entrants; i++) {
                var bonus = Math.floor(rand(minEnd, maxEnd) / 10) + 15 + 5 + level;
                average += bonus;
            }
            var average_bonus = average / entrants,
                baseDie = ((Math.floor((average_bonus / 5)) * 5) * 2 + 10);
            averages.push({
                level: level,
                baseDie: baseDie,
                bonus: Math.floor(average_bonus),
                maxRoll: baseDie + Math.floor(average_bonus),
                qualify: Math.floor((baseDie + Math.floor(average_bonus)) / 5),
                bronze: Math.floor((baseDie + Math.floor(average_bonus)) / 4),
                silver: Math.floor(((baseDie + Math.floor(average_bonus)) / 4) * 2),
                gold: Math.floor(((baseDie + Math.floor(average_bonus)) / 4) * 3),
                champ: Math.floor(((baseDie + Math.floor(average_bonus)) / 4) * champMult),
            });
        }
        return averages;
    }
    $scope.model = {
        minEnd: 50,
        maxEnd: 300,
        entrants: 10,
        champMult: 3.5
    };
    $scope.averageDCs = function () {
        var averages = averageDCs($scope.model.minEnd, $scope.model.maxEnd, $scope.model.entrants, $scope.model.champMult);
        angular.copy(averages, $scope.averages);
    }
    $scope.averages = [];
    $scope.averageDCs();
}]);