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]) + " (" + 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;
}