// Taking 1 million simulations of the standard normal var values = [] var state = 0 for (var i = 0; i < 1000000; i++) { state = MetropolisHastings(stdNormal, state, createNewStateFrom); values.push(state) } //Drawing the data drawData(values) function drawData(values){ var width = 300, height = 400, padding = 30; var svg = d3.select("#vis") .append("svg") .attr("height", height) .attr("width", width) var data = d3.layout.histogram()(values); var x = d3.scale.linear() .domain([-4, 4]) .range([padding, width-padding]); var y = d3.scale.linear() .domain([0, d3.max(data, function(d) { return d.y; })]) .range([height, 0]); var bar = svg.selectAll("rect") .data(data) .enter().append("rect") .classed("bar", true) .attr("x", function(d){ return x(d.x) }) .attr("y", function(d) { return y(d.y) }) .attr("width", (x(data[0].dx) - x(0)) * .95 ) .attr("height", function(d) { return height - y(d.y) - padding; }); var xAxis = d3.svg.axis() .scale(x) .orient("bottom"); svg.append("g") .attr("class", "x axis") .attr("transform", "translate(0," + (height - padding) + ")") .call(xAxis); } //Utility functions function MetropolisHastings(probability, state, generateAState) { var aPossibleState = generateAState(state); var transitionOdds = probability(aPossibleState) / probability(state); var newState if (Math.random() <= transitionOdds) { newState = aPossibleState; } else { newState = state; } return newState; } function stdNormal(X) { var v = (1/Math.sqrt(Math.PI * 2)) * Math.exp( -X * X / 2) return v } function createNewStateFrom(X){ var newState if (Math.random() <= .5) { newState = X + .1 } else { newState = X - .1 } return newState }