// Path: benchmark/src/jmh/java/biz/k11i/rng/util/MtRandom.java
// public class MtRandom extends Random {
//     private final MersenneTwister mersenneTwister;
// 
//     public MtRandom() {
//         mersenneTwister = new MersenneTwister();
//     }
// 
//     public MtRandom(int seed) {
//         mersenneTwister = new MersenneTwister(seed);
//     }
// 
//     @Override
//     public boolean nextBoolean() {
//         return mersenneTwister.nextBoolean();
//     }
// 
//     @Override
//     public void nextBytes(byte[] bytes) {
//         mersenneTwister.nextBytes(bytes);
//     }
// 
//     @Override
//     public double nextDouble() {
//         return mersenneTwister.nextDouble();
//     }
// 
//     @Override
//     public float nextFloat() {
//         return mersenneTwister.nextFloat();
//     }
// 
//     @Override
//     public double nextGaussian() {
//         return mersenneTwister.nextGaussian();
//     }
// 
//     @Override
//     public int nextInt() {
//         return mersenneTwister.nextInt();
//     }
// 
//     @Override
//     public int nextInt(int n) throws IllegalArgumentException {
//         return mersenneTwister.nextInt(n);
//     }
// 
//     @Override
//     public long nextLong() {
//         return mersenneTwister.nextLong();
//     }
// }
// 
// Path: benchmark/src/jmh/java/biz/k11i/rng/util/ParameterPool.java
// public class ParameterPool {
//     private double[] parameters;
//     private int index;
// 
//     public ParameterPool(int seed, int count, double theta) {
//         parameters = new double[count];
//         MtRandom r = new MtRandom(seed);
// 
//         for (int i = 0; i < count; i++) {
//             parameters[i] = Math.nextUp(ExponentialRNG.FAST_RNG.generate(r, theta));
//         }
//     }
// 
//     public double next() {
//         if (index >= parameters.length) {
//             index = 0;
//         }
// 
//         return parameters[index++];
//     }
// }


import biz.k11i.rng.util.MtRandom;
import biz.k11i.rng.util.ParameterPool;
import org.apache.commons.math3.distribution.BetaDistribution;
import org.apache.commons.math3.random.MersenneTwister;
import org.apache.commons.math3.random.RandomGenerator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import java.util.Random;

        private Random random = new MtRandom();
        private BetaDistribution commonsMath;

        @Setup
        public void setUp() {
            String[] items = parameters.split(":");
            alpha = Double.valueOf(items[0]);
            beta = Double.valueOf(items[1]);
            commonsMath = new BetaDistribution(alpha, beta);
        }

        @Benchmark
        public double commonsMath() {
            return commonsMath.sample();
        }

        @Benchmark
        public double fastRng() {
            return BetaRNG.FAST_RNG.generate(random, alpha, beta);
        }

        @Benchmark
        public double generalRng() {
            return BetaRNG.GENERAL_RNG.generate(random, alpha, beta);
        }
    }

    @State(Scope.Benchmark)
    public static class ArbitraryParameters {
// Path: benchmark/src/jmh/java/biz/k11i/rng/util/MtRandom.java
// public class MtRandom extends Random {
//     private final MersenneTwister mersenneTwister;
// 
//     public MtRandom() {
//         mersenneTwister = new MersenneTwister();
//     }
// 
//     public MtRandom(int seed) {
//         mersenneTwister = new MersenneTwister(seed);
//     }
// 
//     @Override
//     public boolean nextBoolean() {
//         return mersenneTwister.nextBoolean();
//     }
// 
//     @Override
//     public void nextBytes(byte[] bytes) {
//         mersenneTwister.nextBytes(bytes);
//     }
// 
//     @Override
//     public double nextDouble() {
//         return mersenneTwister.nextDouble();
//     }
// 
//     @Override
//     public float nextFloat() {
//         return mersenneTwister.nextFloat();
//     }
// 
//     @Override
//     public double nextGaussian() {
//         return mersenneTwister.nextGaussian();
//     }
// 
//     @Override
//     public int nextInt() {
//         return mersenneTwister.nextInt();
//     }
// 
//     @Override
//     public int nextInt(int n) throws IllegalArgumentException {
//         return mersenneTwister.nextInt(n);
//     }
// 
//     @Override
//     public long nextLong() {
//         return mersenneTwister.nextLong();
//     }
// }
// 
// Path: benchmark/src/jmh/java/biz/k11i/rng/util/ParameterPool.java
// public class ParameterPool {
//     private double[] parameters;
//     private int index;
// 
//     public ParameterPool(int seed, int count, double theta) {
//         parameters = new double[count];
//         MtRandom r = new MtRandom(seed);
// 
//         for (int i = 0; i < count; i++) {
//             parameters[i] = Math.nextUp(ExponentialRNG.FAST_RNG.generate(r, theta));
//         }
//     }
// 
//     public double next() {
//         if (index >= parameters.length) {
//             index = 0;
//         }
// 
//         return parameters[index++];
//     }
// }


// Path: benchmark/src/jmh/java/biz/k11i/rng/BetaBenchmark.java
import biz.k11i.rng.util.MtRandom;
import biz.k11i.rng.util.ParameterPool;
import org.apache.commons.math3.distribution.BetaDistribution;
import org.apache.commons.math3.random.MersenneTwister;
import org.apache.commons.math3.random.RandomGenerator;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import java.util.Random;


        private Random random = new MtRandom();
        private BetaDistribution commonsMath;

        @Setup
        public void setUp() {
            String[] items = parameters.split(":");
            alpha = Double.valueOf(items[0]);
            beta = Double.valueOf(items[1]);
            commonsMath = new BetaDistribution(alpha, beta);
        }

        @Benchmark
        public double commonsMath() {
            return commonsMath.sample();
        }

        @Benchmark
        public double fastRng() {
            return BetaRNG.FAST_RNG.generate(random, alpha, beta);
        }

        @Benchmark
        public double generalRng() {
            return BetaRNG.GENERAL_RNG.generate(random, alpha, beta);
        }
    }

    @State(Scope.Benchmark)
    public static class ArbitraryParameters {
        private Random random = new MtRandom();