package de.invesdwin.util.math.decimal.internal.randomize; import java.util.Iterator; import java.util.List; import javax.annotation.concurrent.ThreadSafe; import org.apache.commons.math3.random.RandomGenerator; import de.invesdwin.util.math.decimal.ADecimal; import de.invesdwin.util.math.decimal.IDecimalAggregate; @ThreadSafe public class BootstrapRandomizer<E extends ADecimal<E>> implements IDecimalRandomizer<E> { private final List<? extends E> sample; public BootstrapRandomizer(final IDecimalAggregate<E> parent) { this.sample = parent.values(); } @Override public Iterator<E> randomize(final RandomGenerator random) { return new Iterator<E>() { private final int size = sample.size(); private int resampleIdx = 0; @Override public boolean hasNext() { return resampleIdx < size; } @Override public E next() { final int sourceIdx = random.nextInt(size); resampleIdx++; return sample.get(sourceIdx); } }; } }