JSFiddle - React, Tailwind, and code Playground

by Timatnet

HTML

<html>
<head>
<script type="text/javascript"
  src="http://dygraphs.com/dygraph-combined.js"></script>
<script type="text/javascript"
  src="https://raw.github.com/Ivajkin/common.js/master/common.js"></script>
</head>
<body>
<div id="graphdiv"
  style="width:500px; height:300px;"></div>

</body>
</html>

JavaScript

/*function assert(expression) {
    if(!expression) throw "Assert failed!";
}

var cos = Math.cos,
    sin = Math.sin,
    π = Math.PI,
    random = Math.random,
    sqrt = Math.sqrt,
    ln = Math.log;*/

/*Array.prototype.fold = function(sum, f) {
    for(var i = 0; i < this.length; ++i) {
        sum = f(sum, this[i]);
    }
    return sum;
};
var sum = function(sum, x) {return sum + x;};
function generate(N, f) {
    var _ = [];
    for(var i = 0; i < N; ++i) {
        _.push(f(i));
    }
    return _;
}*/

assert(6 === [1, 2, 3].fold(0, sum));
assert("123" === ["1", "2", "3"].fold("", sum));

var Normal = {
    CLT: function(N) {
        assert(N < 100);
        return generate(N, random).fold(0, sum)/N;
    },
    Muller: function() {
        if(this._MullerVal === null) {
            var φ = random(),
                r = random();
            var x = sqrt(-2*ln(r));
            this._MullerVal = sin(2*π*φ)*x;
            return cos(2*π*φ)*x;
        } else {
            var val = this._MullerVal;
            this._MullerVal = null;
            return val;
        }
    },
    _MullerVal: null
};


var values = [],
    size = 50;
for(var i = 0; i < size; ++i) {values[i] = 0;}

var iterationCount = 1000000;
for(var i = 0; i < iterationCount; ++i) {
    ++values[Math.round(Normal.CLT(10) * size)];
}

var data = "Value,P\n";
for(var i = 0; i < size; ++i) {
    data += (i/size) + "," + (values[i]/iterationCount)  + "\n";
}

g = new Dygraph(

    // containing div
    document.getElementById("graphdiv"),
    data

  );