// 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.GammaDistribution;
import org.apache.commons.math3.random.MersenneTwister;
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;
package biz.k11i.rng;



public class GammaBenchmark {
    @State(Scope.Benchmark)
    public static class FixedParameters {
        @Param({"0.05", "0.1", "0.2", "0.5", "0.9", "1.0", "1.1", "40.0", "10000.0"})
        public double shape;
        public double scale = 1.0;

// 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/GammaBenchmark.java
import biz.k11i.rng.util.MtRandom;
import biz.k11i.rng.util.ParameterPool;
import org.apache.commons.math3.distribution.GammaDistribution;
import org.apache.commons.math3.random.MersenneTwister;
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;

package biz.k11i.rng;



public class GammaBenchmark {
    @State(Scope.Benchmark)
    public static class FixedParameters {
        @Param({"0.05", "0.1", "0.2", "0.5", "0.9", "1.0", "1.1", "40.0", "10000.0"})
        public double shape;
        public double scale = 1.0;

        private Random random = new MtRandom();