void markovgen(const MatDoub_I &atrans, VecInt_O &out, Int istart=0, Int seed=1) { Int i, ilo, ihi, ii, j, m = atrans.nrows(), n = out.size(); MatDoub cum(atrans); Doub r; Ran ran(seed); if (m != atrans.ncols()) throw("transition matrix must be square"); for (i=0; i 0.01) throw("transition matrix rows must sum to 1"); } j = istart; out[0] = j; for (ii=1; ii 1) { i = (ihi+ilo) >> 1; if (r>cum[j][i-1]) ilo = i; else ihi = i; } out[ii] = j = ilo; } }