in commons-rng-sampling/src/main/java/org/apache/commons/rng/sampling/distribution/ChengBetaSampler.java [260:298]
public double sample() {
double w;
while (true) {
// Step 1:
final double u1 = rng.nextDouble();
final double u2 = rng.nextDouble();
// Compute Y and Z
final double y = u1 * u2;
final double z = u1 * y;
if (u1 < ONE_HALF) {
// Step 2:
if (ONE_QUARTER * u2 + z - y >= k1) {
continue;
}
} else {
// Step 3:
if (z <= ONE_QUARTER) {
final double v = beta * (Math.log(u1) - Math.log1p(-u1));
w = a * Math.exp(v);
break;
}
// Step 4:
if (z >= k2) {
continue;
}
}
// Step 5:
final double v = beta * (Math.log(u1) - Math.log1p(-u1));
w = a * Math.exp(v);
if (alpha * (logAlpha - Math.log(b + w) + v) - LN_4 >= Math.log(z)) {
break;
}
}
// Step 6:
return computeX(w);
}