Exclusive randoms

Damn randoms. TODO: resource from jqplot.com is failing to load.

by davidhong

HTML

<script src="http://baagoe.com/en/RandomMusings/javascript/Mash.js"></script>
<script src="http://baagoe.com/en/RandomMusings/javascript/Alea.js"></script>
<script src="http://www.jqplot.com/src/jquery.jqplot.min.js"></script>
<script src="http://www.jqplot.com/src/plugins/jqplot.canvasTextRenderer.min.js"></script>
<script src="http://www.jqplot.com/src/plugins/jqplot.canvasAxisLabelRenderer.min.js"></script>
<figure>
    <div id="graph"></div>
    <figcaption>Frequence of randomly generated numbers in range (0, 100]</figcaption>
</figure>

JavaScript

// A random function which excludes given set of samples
//
// @param {Number} n – upper boundary of random number being generated
// @param {Array} exclusions – an array containing a list of numbers to exclude
// @returns {Number} between (0, n]

function random(n, exclusions) {
    var r = function() { return Alea(Math.random()).uint32(); },
        result;

    if (typeof n == 'number')
        result = r() % n;
    else 
        result = r();
    
    // Simple exclusion test & recursion...
    if ($.isArray(exclusions) && exclusions.indexOf(result) >= 0) 
        return random(n, exclusions);
    else 
        return result;
};

// Test your randomness.
$(function() {
    var i = 0,
        length = 333,
        data = [],
        exclude = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        sample, value;

    for (; i < length; i += 1) {
        sample = random(100, exclude);
        value = data[sample] || 0;

        data[sample] = value + 1;
    }
    
    // Human friendly representation of the data collected.
    $.jqplot('graph',  [data]);
});