1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.rng.sampling.distribution;
18
19 import org.apache.commons.rng.UniformRandomProvider;
20 import org.apache.commons.rng.core.source32.IntProvider;
21 import org.apache.commons.rng.sampling.RandomAssert;
22 import org.junit.jupiter.api.Assertions;
23 import org.junit.jupiter.api.Test;
24
25
26
27
28 class MarsagliaNormalisedGaussianSamplerTest {
29
30
31
32 @Test
33 void testSharedStateSampler() {
34 final UniformRandomProvider rng1 = RandomAssert.seededRNG();
35 final UniformRandomProvider rng2 = RandomAssert.seededRNG();
36 final SharedStateContinuousSampler sampler1 =
37 MarsagliaNormalizedGaussianSampler.<MarsagliaNormalizedGaussianSampler>of(rng1);
38 final SharedStateContinuousSampler sampler2 = sampler1.withUniformRandomProvider(rng2);
39 RandomAssert.assertProduceSameSequence(sampler1, sampler2);
40 }
41
42
43
44
45
46 @Test
47 void testSamplePairIsRejected() {
48 final double value = 0.25;
49 final UniformRandomProvider rng = new IntProvider() {
50 private int i;
51
52 @Override
53 public int next() {
54
55 return 0;
56 }
57
58 @Override
59 public double nextDouble() {
60 i++;
61 if (i <= 2) {
62
63
64 return 1.0;
65 }
66 if (i <= 4) {
67
68
69 return 0.5;
70 }
71 return value;
72 }
73 };
74
75 final MarsagliaNormalizedGaussianSampler sampler = new MarsagliaNormalizedGaussianSampler(rng);
76
77
78 final double x = 2 * value - 1;
79 final double r2 = x * x + x * x;
80 final double expected = x * Math.sqrt(-2 * Math.log(r2) / r2);
81 Assertions.assertEquals(expected, sampler.sample());
82 }
83 }