} // end set-up
for (;;) {
// generate uniform number U -- U(0, p6)
// case distinction corresponding to U
if ((U = gen.raw() * p6) < p2) { // centre left
// immediate acceptance region R2 = [k2, m) *[0, f2), X = k2, ... m -1
if ((V = U - p1) < 0.0) return(k2 + (int)(U/f2));
// immediate acceptance region R1 = [k1, k2)*[0, f1), X = k1, ... k2-1
if ((W = V / dl) < f1 ) return(k1 + (int)(V/f1));