dwyl / learn-javascript

A Series of Simple Steps in JavaScript :-)
Other
64 stars 15 forks source link

Random Number Generator "Randomness" Check? #21

Open nelsonic opened 8 years ago

nelsonic commented 8 years ago

Given the following "Random Integer between range X and Y" function:

/**
 * Returns a random integer between min (inclusive) and max (inclusive)
 * Using Math.round() will give you a non-uniform distribution!
 * from: http://stackoverflow.com/a/1527820/1148249
 */
function get_random_int(min, max) {
    return Math.floor(Math.random() * (max - min + 1)) + min;
}

We can run the following test to confirm the randomness:

var i = 0; // counter for looping.
var results = {}; // store the results of running get_random_int
var min = 0;
var max = 9;
for(i = min; i <= max; i++) {
  results[i] = 0; // initialize results to zero;
}
i = 0; // reset/reuse i counter.
var test_count = 10000000;
while(i < test_count) {
  var r = get_random_int(min, max);
  results[r]++; // increment the count for a given random number
  i++;
}
Object.keys(results).forEach(function(k) {
  results[k] = results[k].toString() + ' > ' + (results[k] / test_count * 100).toFixed(3) + ' %';
});
console.log(JSON.stringify(results, null, 2));

Which outputs:

{
  "0": "1000900 > 10.009 %",
  "1": "999727 > 9.997 %",
  "2": "999742 > 9.997 %",
  "3": "999268 > 9.993 %",
  "4": "1000650 > 10.007 %",
  "5": "998621 > 9.986 %",
  "6": "1000241 > 10.002 %",
  "7": "1000716 > 10.007 %",
  "8": "1000151 > 10.002 %",
  "9": "999984 > 10.000 %"
}

Which is a pretty decent distribution...