/* @(#)ProbStatTools.java 1.0 10 October 2004 */ import edu.neu.ccs.util.*; /** *

Class ProbStatTools

collects static methods that * are useful for randomization, probability, and statistics.

*/ public class ProbStatTools { /** Prevent instantiation. */ private ProbStatTools() { } /** *

Returns an array with the integers in sequence: * 0, 1, etc, up to (n-1).

* *

If n is less than or equal to zero, then returns an * empty array of integers.

*/ public static int[] integerSequence(int n) { if (n <= 0) return new int[0]; int[] result = new int[n]; for (int i = 0; i < n; i++) result[i] = i; return result; } /** *

Returns an array of length k consisting of integers * chosen from 0 to (n-1) with repetition permitted.

* *

If n or k is less than or equal to zero, then returns * an empty array of integers.

*/ public static int[] selectWithRepetition(int n, int k) { if ((n <= 0) || (k <= 0)) return new int[0]; return selectWithRepetition(integerSequence(n), k); } /** *

Returns an array of length k consisting of integers * chosen from 0 to (n-1) with no repetition permitted.

* *

If k is less than or equal to zero or greater than n, * then returns an empty array of integers.

*/ public static int[] selectWithNoRepetition(int n, int k) { if ((k <= 0) || (k > n)) return new int[0]; return selectWithNoRepetition(integerSequence(n), k); } /** *

Returns an array whose contents is a random selection of * k elements from the contents of the given data with * repetition of a selected index permitted.

* *

The data array is unchanged.

* *

If the data array is null * or if k is less than or equal to zero, * then returns an empty array of integers.

*/ public static int[] selectWithRepetition(int[] data, int k) { if ((data == null) || (k <= 0)) return new int[0]; int size = data.length; int[] result = new int[k]; for (int i = 0; i < k; i++) { int j = MathUtilities.randomInt(0, size - 1); result[i] = data[j]; } return result; } /** *

Returns an array whose contents is a random selection of * k elements from the contents of the given data with * no repetition of a selected index.

* *

The data array is unchanged.

* *

If the data array is null * or if k is less than or equal to zero * or if k is greater than the data array size, * then returns an empty array of integers.

*/ public static int[] selectWithNoRepetition(int[] data, int k) { if (data == null) return new int[0]; int size = data.length; if ((k <= 0) || (k > size)) return new int[0]; int[] temp = repeatData(data, 1); int[] result = new int[k]; for (int i = 0; i < k; i++) { int j = MathUtilities.randomInt(i, size - 1); int copy = temp[i]; temp[i] = temp[j]; temp[j] = copy; result[i] = temp[i]; } return result; } /** *

Returns an array whose contents is a random permutation * of the contents in the data array.

* *

The data array is unchanged.

* *

If the data array is null, * then returns an empty array of integers.

*/ public static int[] randomPermutation(int[] data) { if (data == null) return new int[0]; return selectWithNoRepetition(data, data.length); } /** *

Returns an int array that repeats the data in * the given array sequentially k times. * *

If the data array is null or * if k is less than or equal to zero, * then returns an empty array of integers.

* *

If k equals one, then copies the given data.

*/ public static int[] repeatData(int[] data, int k) { if ((data == null) || (k <= 0)) return new int[0]; int size1 = data.length; int sizek = k * size1; int[] result = new int[sizek]; for (int i = 0; i < size1; i++) { for (int j = 0; j < k; j++) { result[i + j * size1] = data[i]; } } return result; } }