JSFiddle - React, Tailwind, and code Playground

HTML

<div id="results">

</div>

TypeScript

module Data {
	export var Rates = {
		1: {
			'Chance': 1,
			'Failstack': 0,
			'MaxFailstack': 0
		},
		2: {
			'Chance': 1,
			'Failstack': 0,
			'MaxFailstack': 0
		},
		3: {
			'Chance': 1,
			'Failstack': 0,
			'MaxFailstack': 0
		},
		4: {
			'Chance': 1,
			'Failstack': 0,
			'MaxFailstack': 0
		},
		5: {
			'Chance': 1,
			'Failstack': 0,
			'MaxFailstack': 0
		},
		6: {
			'Chance': 1,
			'Failstack': 0,
			'MaxFailstack': 0
		},
		7: {
			'Chance': 1,
			'Failstack': 0,
			'MaxFailstack': 0
		},
		8: {
			'Chance': 0.2,
			'Failstack': 0.025,
			'MaxFailstack': 13
		},
		9: {
			'Chance': 0.175,
			'Failstack': 0.02,
			'MaxFailstack': 14
		},
		10: {
			'Chance': 0.15,
			'Failstack': 0.015,
			'MaxFailstack': 15
		},
		11: {
			'Chance': 0.125,
			'Failstack': 0.0125,
			'MaxFailstack': 16
		},
		12: {
			'Chance': 0.1,
			'Failstack': 0.0075,
			'MaxFailstack': 18
		},
		13: {
			'Chance': 0.075,
			'Failstack': 0.0063,
			'MaxFailstack': 20
		},
		14: {
			'Chance': 0.05,
			'Failstack': 0.005,
			'MaxFailstack': 25
		},
		15: {
			'Chance': 0.025,
			'Failstack': 0.005,
			'MaxFailstack': 25
		}
	};
}

module Calculator {
	export class Weapon {

		SampleSize: number = 1000000;

		constructor() {}

		public AttemptLevel(level: number): number {
			var attempts = 0;
			var success = false;

			var rates = Data.Rates[level];
			while(!success) {
				var chance = rates.Chance + (Math.min(rates.MaxFailstack, attempts) * rates.Failstack);
				var roll = Calculator.Random(0, 10000);
				if(chance * 10000 >= roll) {
					success = true;
				}
				attempts++;
			}

			return attempts;
		}
	  
		public AverageAttemptsFor(goallevel: number): number {
			var totalattempts = 0;
			for(var i=0; i<this.SampleSize; i++) {
				for(var n=1; n<=goallevel; n++) {
					totalattempts += this.AttemptLevel(n);
				}
			}

			return totalattempts/this.SampleSize;
		}
	}

	export function Random(min: number, max: number): number {
		return Math.floor(Math.random() * (max -...