JSFiddle - React, Tailwind, and code Playground
by nwellcome
JavaScript
// Ladder simulator
// Variables:
// Initial population count
// Population growth rate
// Player average win rate
// Player average play rate
// Player average growth rate
// Player sigma win rate
// Player sigma play rate
// Player sigma growth rate
var INITIAL_POPULATION = 500;
var AVG_WIN_RATE = 0.5;
var STD_WIN_RATE = 0.2;
var AVG_PLAY_RATE = 1;
var STD_PLAY_RATE = 1;
var AVG_GROWTH_RATE = 1;
var STD_GROWTH_RATE = 1;
var players = [];
function randomlyPopulatePlayers(players, numberOfPlayers) {
var z = new Ziggurat();
for (var i = 0; i < numberOfPlayers; i++) {
players.push((z.nextGaussian() * STD_WIN_RATE + AVG_WIN_RATE));
}
}
function ladderSimulation(players) {
var ranks = [];
this.populateRanks = function () {
}
this.tick = function() {
}
}
function main() {
randomlyPopulatePlayers(players, INITIAL_POPULATION);
}
main();
function Ziggurat() {
var jsr = 123456789;
var wn = Array(128);
var fn = Array(128);
var kn = Array(128);
function RNOR() {
var hz = SHR3();
var iz = hz & 127;
return (Math.abs(hz) < kn[iz]) ? hz * wn[iz] : nfix(hz, iz);
}
this.nextGaussian = function() {
return RNOR();
}
function nfix(hz, iz) {
var r = 3.442619855899;
var r1 = 1.0 / r;
var x;
var y;
while (true) {
x = hz * wn[iz];
if (iz == 0) {
x = (-Math.log(UNI()) * r1);
y = -Math.log(UNI());
while (y + y < x * x) {
x = (-Math.log(UNI()) * r1);
y = -Math.log(UNI());
}
return (hz > 0) ? r + x : -r - x;
}
if (fn[iz] + UNI() * (fn[iz - 1] - fn[iz]) < Math.exp(-0.5 * x * x)) {
return x;
}
hz = SHR3();
iz = hz & 127;
if (Math.abs(hz) < kn[iz]) {
...