- removed rngs - added method for streams in Rng - changed the number of streams possibles - parallel and iterative run give now the same results
59 lines
1.6 KiB
Java
59 lines
1.6 KiB
Java
package net.berack.upo.valpre.rand;
|
|
|
|
import static org.junit.Assert.assertEquals;
|
|
import static org.junit.Assert.assertNotEquals;
|
|
import static org.junit.Assert.assertTrue;
|
|
|
|
import java.util.Arrays;
|
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
public class TestRandom {
|
|
|
|
@Test
|
|
public void testRng() {
|
|
Rng rng = new Rng(1);
|
|
for (var i = 0; i < 10000; i++)
|
|
rng.random();
|
|
assertEquals(399268537L, rng.getSeed());
|
|
}
|
|
|
|
@Test
|
|
public void testRngs() {
|
|
var rngs = Rng.getMultipleStreams(1, 200);
|
|
assertEquals(256, rngs.length);
|
|
|
|
var rng0 = rngs[0];
|
|
var rng1 = rngs[1];
|
|
|
|
for (int i = 0; i < 8367781; i++) {
|
|
rng0.random();
|
|
assertNotEquals(rng1.getSeed(), rng0.getSeed());
|
|
}
|
|
assertEquals(Rng.MULT_256, rng1.getSeed());
|
|
|
|
rng0.random();
|
|
assertEquals(rng0.getSeed(), rng1.getSeed());
|
|
}
|
|
|
|
@Test
|
|
public void testRngVariance() {
|
|
var numbers = new int[5000];
|
|
var rng = new Rng(4656);
|
|
|
|
for (var i = 0; i < 1000000; i++) {
|
|
var sample = rng.random();
|
|
var index = (int) (sample * numbers.length);
|
|
numbers[index] += 1;
|
|
}
|
|
|
|
var avg = (double) Arrays.stream(numbers).sum() / numbers.length;
|
|
var variance = Arrays.stream(numbers).mapToDouble(num -> Math.pow(num - avg, 2)).sum() / numbers.length;
|
|
var stdDev = Math.sqrt(variance);
|
|
var expected = Math.sqrt((double) numbers.length / 12);
|
|
expected *= 1.1; // adding a bit of margin
|
|
|
|
assertTrue("Standard Dev must be less than [" + expected + "] -> [" + stdDev + "]", stdDev < expected);
|
|
}
|
|
}
|