Markov Chain

JavaScript

function pick(weights) {
    var totalWeight = 0;
    var rnd = Math.random();
    for (var i = 0; i < weights.length; i++) {
        totalWeight += weights[i]
        if (rnd <= totalWeight) {
            return i;
        }
    }
    console.log(rnd + " " + totalWeight + " was a problem");
}

function print(hist, max) {
    var str = "";
    for (var i = 0; i < hist.length; i++) {
        str += (hist[i] / max) + "\t";
    }
    console.log(str);
}

// 2% lower chance of 2 consecutive, 4% lower chance of 3, 6% lower chance of 3+
var tableA = [
//  h1,   h2,   h3+,  c1,   c2,   c3+,   m1,   m2,   m3+
   [0.00, 0.28, 0.00, 0.11, 0.00, 0.00, 0.61, 0.00, 0.00], // h1
   [0.00, 0.00, 0.26, 0.12, 0.00, 0.00, 0.62, 0.00, 0.00], // h2
   [0.00, 0.00, 0.24, 0.13, 0.00, 0.00, 0.63, 0.00, 0.00], // h3
   [0.31, 0.00, 0.00, 0.00, 0.08, 0.00, 0.61, 0.00, 0.00], // c1
   [0.32, 0.00, 0.00, 0.00, 0.00, 0.06, 0.62, 0.00, 0.00], // c2
   [0.33, 0.00, 0.00, 0.00, 0.00, 0.04, 0.63, 0.00, 0.00], // c3
   [0.31, 0.00, 0.00, 0.11, 0.00, 0.00, 0.00, 0.58, 0.00], // m1
   [0.32, 0.00, 0.00, 0.12, 0.00, 0.00, 0.00, 0.00, 0.56], // m2
   [0.33, 0.00, 0.00, 0.13, 0.00, 0.00, 0.00, 0.00, 0.54]  // m3
];

// Constant chance of each
var tableB = [
//  h1,   h2,   h3+,  c1,   c2,   c3+,   m1,   m2,   m3+
   [0.00, 0.30, 0.00, 0.10, 0.00, 0.00, 0.60, 0.00, 0.00], // h1
   [0.00, 0.00, 0.30, 0.10, 0.00, 0.00, 0.60, 0.00, 0.00], // h2
   [0.00, 0.00, 0.30, 0.10, 0.00, 0.00, 0.60, 0.00, 0.00], // h3
   [0.30, 0.00, 0.00, 0.00, 0.10, 0.00, 0.60, 0.00, 0.00], // c1
   [0.30, 0.00, 0.00, 0.00, 0.00, 0.10, 0.60, 0.00, 0.00], // c2
   [0.30, 0.00, 0.00, 0.00, 0.00, 0.10, 0.60, 0.00, 0.00], // c3
   [0.30, 0.00, 0.00, 0.10, 0.00, 0.00, 0.00, 0.60, 0.00], // m1
   [0.30, 0.00, 0.00, 0.10, 0.00, 0.00, 0.00, 0.00, 0.60], // m2
   [0.30, 0.00, 0.00, 0.10, 0.00, 0.00, 0.00, 0.00, 0.60]  // m3
];

function printHist(table) {
    var max = 10000000;
    var histMap = [0, 0, 0, 1, 1, 1, 2, 2, 2];
    var...