Random test

by jfriend00

HTML

<div id="result">Running...</div>
<br>
<input id="stopButton" type="button" value=" Stop ">

CSS

#result {font-family: Courier New;}

JavaScript

var numRuns = 10000000;  // how many total cycles to do
var chunkToRun = 10000;   // how many cycles per pass (so browser won't get unhappy)
var numBuckets = 3;       // how many buckets to split the random across
var stopped = false;

// initialize results array
var results = [];
for (var i = 0; i < numBuckets; i++) {
    results.push(0);
}

$("#stopButton").click(function() {
    stopped = true;
});


var runsRemaining = numRuns;  // keep track of number of runs remaining

function runChunk() {
    for (var i = 0, num = Math.min(runsRemaining, chunkToRun); i < num; i++) {
        var val = Math.floor(Math.random() * numBuckets);
        ++results[val];
        --runsRemaining;
    }
    if (runsRemaining > 0 && !stopped) {
        showProgress();
        setTimeout(runChunk, 1);
    } else {
        showResults();
    }
}

runChunk();

function showProgress() {
    $("#result").html("Calculations remaining: " + addCommas(runsRemaining));
}

function showResults() {
    var runs = numRuns - runsRemaining;
    var str = "Number of Cycles Executed: " + addCommas(runs) + "<br>";
    var avg = runs / numBuckets;
    for (var i = 0; i < numBuckets; i++) {
        var variation = (((results[i] - avg) / avg) * 100).toFixed(6);
        var display = variation;
        if (variation >= 0) {
            display = "+" + variation;
        }
        str += addCommas(results[i]) + " &nbsp;&nbsp;&nbsp;(" + display + "%)<br>" 
    }
    $("#stopButton").hide();
    $("#result").html(str);
}

function addCommas(str) {
    var parts = (str + "").split("."),
        main = parts[0],
        len = main.length,
        output = "",
        i = len - 1;
    
    while(i >= 0) {
        output = main.charAt(i) + output;
        if ((len - i) % 3 === 0 && i > 0) {
            output = "," + output;
        }
        --i;
    }
    // put decimal part back
    if (parts.length > 1) {
        output += "." + parts[1];
    }
    return output;
}