1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.apache.commons.rng.simple.internal;
19
20 import org.apache.commons.math3.stat.inference.ChiSquareTest;
21 import org.apache.commons.rng.UniformRandomProvider;
22 import org.apache.commons.rng.core.source64.SplitMix64;
23 import org.junit.Assert;
24 import org.junit.Test;
25
26 import java.util.Arrays;
27
28
29
30
31 public class SeedUtilsTest {
32
33
34
35
36
37 @Test
38 public void testCreateIntHexPermutation() {
39 final UniformRandomProvider rng = new SplitMix64(-567435247L);
40 final long[][] samples = new long[8][16];
41 for (int i = 0; i < 1000; i++) {
42 int sample = SeedUtils.createIntHexPermutation(rng);
43 int observed = 0;
44 for (int j = 0; j < 8; j++) {
45 final int digit = sample & 0xf;
46 Assert.assertEquals("Duplicate digit in sample", 0, observed & (1 << digit));
47 observed |= 1 << digit;
48 samples[j][digit]++;
49 sample >>>= 4;
50 }
51 }
52
53 final ChiSquareTest chiSquareTest = new ChiSquareTest();
54 final double[] expected = new double[16];
55 Arrays.fill(expected, 1.0 / 16);
56
57 for (int j = 0; j < 8; j++) {
58 Assert.assertFalse("Not uniform in digit " + j,
59 chiSquareTest.chiSquareTest(expected, samples[j], 0.001));
60 }
61 }
62
63
64
65
66
67
68
69 @Test
70 public void testCreateLongHexPermutation() {
71 final UniformRandomProvider rng = new SplitMix64(34645768L);
72 final long[][] samples = new long[16][16];
73 for (int i = 0; i < 1000; i++) {
74 long sample = SeedUtils.createLongHexPermutation(rng);
75
76 long observed = 0;
77 for (int j = 0; j < 8; j++) {
78 final int digit = (int) (sample & 0xfL);
79 Assert.assertEquals("Duplicate digit in lower sample", 0, observed & (1 << digit));
80 observed |= 1 << digit;
81 samples[j][digit]++;
82 sample >>>= 4;
83 }
84
85 observed = 0;
86 for (int j = 8; j < 16; j++) {
87 final int digit = (int) (sample & 0xfL);
88 Assert.assertEquals("Duplicate digit in upper sample", 0, observed & (1 << digit));
89 observed |= 1 << digit;
90 samples[j][digit]++;
91 sample >>>= 4;
92 }
93 }
94
95 final ChiSquareTest chiSquareTest = new ChiSquareTest();
96 final double[] expected = new double[16];
97 Arrays.fill(expected, 1.0 / 16);
98
99 for (int j = 0; j < 16; j++) {
100 Assert.assertFalse("Not uniform in digit " + j,
101 chiSquareTest.chiSquareTest(expected, samples[j], 0.001));
102 }
103 }
104 }