package de.randi2.simulation.unit.distribution; import static junit.framework.Assert.assertEquals; import static junit.framework.Assert.assertTrue; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.junit.Test; import de.randi2.simulation.distribution.ConcreteDistribution; import de.randi2.utility.Pair; public class ConcreteDistributionTest { private int runsPerEntry = 1000; private double limit = 0.05; private void testConcreteDistribution(ConcreteDistribution<Integer> cd){ int all = 0; for(int i : cd.getRatio()){ all+=i; } int runs = runsPerEntry*all; int[] values = new int[cd.getElements().size()]; for(int i =0; i<runs;i++){ values[cd.getNextValue()]++; } for(int i = 0; i< values.length;i++){ double mean = (1.0 * values[i]) / runs; double realMean = (1.0/all)*cd.getRatio()[i]; double limitL = realMean-limit; double limitH = realMean+limit; assertTrue("error: " + mean +" > " + limitL,(mean)>limitL); assertTrue("error: " + mean +" < " +limitH,(mean)<limitH); } } @SuppressWarnings("unchecked") @Test public void test1000Times(){ for(int i=0; i<1000;i++){ testConcreteDistribution(new ConcreteDistribution<Integer>(Arrays.asList(0,1,2,3), 2,5,2,1)); testConcreteDistribution(new ConcreteDistribution<Integer>(Arrays.asList(0,1),2,1)); testConcreteDistribution(new ConcreteDistribution<Integer>(Arrays.asList(0,1),1,2)); testConcreteDistribution(new ConcreteDistribution<Integer>(Arrays.asList(0,1),1,3)); testConcreteDistribution(new ConcreteDistribution<Integer>(Arrays.asList(0,1,2,3), 5,5,2,1)); testConcreteDistribution(new ConcreteDistribution<Integer>(Pair.of(0, 5),Pair.of(1, 5),Pair.of(2, 2),Pair.of(3, 1))); } } @Test public void testSeed(){ List<Integer> results = new ArrayList<Integer>(); ConcreteDistribution<Integer> cd = new ConcreteDistribution<Integer>(100, Arrays.asList(0,1,2,3), 2,5,2,1); for(int i=0;i<1000;i++){ results.add(cd.getNextValue()); } List<ConcreteDistribution<Integer>> cds = new ArrayList<ConcreteDistribution<Integer>>(); for(int i=0;i<100;i++){ cds.add(new ConcreteDistribution<Integer>(100, Arrays.asList(0,1,2,3), 2,5,2,1)); } for(Integer result : results){ for(ConcreteDistribution<Integer> acd : cds){ assertEquals(result, acd.getNextValue()); } } } }