Combinatorics { public static int[] subset(final int n, final int k) { return subset(n, k, RandomRegistry.random()); } private  Combinatorics(); static int[] subset(final int n, final int k); static int[] subset(final int n, final int k, final Random random); static int[] subset(final int[] set, final int k); static int[] subset(final int[] set, final int k, final Random random); static int[] subset(final int n, final int[] sub); static int[] subset(final int n, final int[] a, final Random random); static void checkSubSet(final int n, final int k);  }
@Test public void compatibility() { for (int i = 1; i <= 1000; ++i) { int[] sub1 = subset(1000, new int[i], new Random(123)); int[] sub2 = new int[i]; Combinatorics.subset(1000, sub2, new Random(123)); Assert.assertTrue(Arrays.equals(sub2, sub1), "K: " + i); } }
@Test(dataProvider = "combinations") public void allCombinations(final int n, final int k) { final Random random = new Random(); final Set<String> subsets = new HashSet<>(); for (int i = 0; i < 3000; ++i) { subsets.add(Arrays.toString(Combinatorics.subset(n, new int[k], random))); } Assert.assertEquals(subsets.size(), binomial(n, k)); }
@Test public void subset() { final Random random = new Random(); for (int i = 1; i <= 1000; ++i) { int[] sub = new int[i]; Combinatorics.subset(1000, sub, random); Assert.assertTrue(isSortedAndUnique(sub), "K: " + i); } }
@Test(invocationCount = 20, successPercentage = 95) public void subSetDistribution() { final int[] sub = new int[3]; final int n = 100_000; final Random random = new Random(); final Histogram<Integer> histogram = Histogram.ofInteger(0, n, 13); IntStream.range(0, 10_000) .flatMap(i -> IntStream.of(Combinatorics.subset(n, sub, random))) .forEach(histogram::accept); assertUniformDistribution(histogram); }