1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.rng.sampling;
18
19 import org.junit.Assert;
20 import org.junit.Test;
21 import org.apache.commons.rng.simple.RandomSource;
22 import org.apache.commons.rng.UniformRandomProvider;
23
24
25
26
27 public class UnitSphereSamplerTest {
28
29
30
31 @Test
32 public void testDistribution2D() {
33 UniformRandomProvider rng = RandomSource.create(RandomSource.XOR_SHIFT_1024_S, 17399225432L);
34 UnitSphereSampler generator = new UnitSphereSampler(2, rng);
35
36
37 final int[] angleBuckets = new int[100];
38 final int steps = 1000000;
39 for (int i = 0; i < steps; ++i) {
40 final double[] v = generator.nextVector();
41 Assert.assertEquals(2, v.length);
42 Assert.assertEquals(1, length(v), 1e-10);
43
44
45
46 final double angle = Math.acos(v[0]);
47 final int bucket = (int) (angle / Math.PI * angleBuckets.length);
48 ++angleBuckets[bucket];
49 }
50
51
52 final int expectedBucketSize = steps / angleBuckets.length;
53 for (int bucket : angleBuckets) {
54 Assert.assertTrue("Bucket count " + bucket + " vs expected " + expectedBucketSize,
55 Math.abs(expectedBucketSize - bucket) < 350);
56 }
57 }
58
59
60
61
62 private static double length(double[] vector) {
63 double total = 0;
64 for (double d : vector) {
65 total += d * d;
66 }
67 return Math.sqrt(total);
68 }
69 }