/* package whatever; // don't place package name! */
import java.util.*;
import java.lang.*;
import java.io.*;
class Ideone
{
public static class User
{
public static final int MINIT = 20;
public static final int MAXIT = 50;
private int iterations;
//private static Random random = new Random();
public void setIterations()
{
setIterations(MINIT+random.nextInt(MAXIT-MINIT));
}
private void setIterations(int iterations) {
this.iterations = iterations;
}
public int getIterations() {
return iterations;
}
}
private static User user = new User();
public static void testRandomNumbers(int SIZE) {
final int TIMES = 30;
int results = 0;
for(int i = 0; i < TIMES; i++)
{
if (randomNumbersRun(SIZE))
{
results++;
}
}
//System.out.println(results >= TIMES * 80 / 100);
}
private static boolean randomNumbersRun(int SIZE)
{
ArrayList<Integer> list = new ArrayList<Integer>();
int r = User.MAXIT - User.MINIT;
//final int SIZE = 11;
for (int i = 0; i < r*SIZE; i++) {
user.setIterations();
list.add(user.getIterations());
}
return isRandom(list, r);
}
public static boolean isRandom(ArrayList<? extends Number> randomNums, int r) {
//According to Sedgewick: "This is valid if N is greater than about 10r"
if (randomNums.size() <= 10 * r) {
return false;
}
//PART A: Get frequency of randoms
Map
<Number, Integer
> ht
= getFrequencies
(randomNums
);
//PART B: Calculate chi-square - this approach is in Sedgewick
double n_r = (double) randomNums.size() / r;
double chiSquare = 0;
for (int v : ht.values()) {
double f = v - n_r;
chiSquare += f * f;
}
chiSquare /= n_r;
//PART C: According to Swdgewick: "The statistic should be within 2(r)^1/2 of r
//This is valid if N is greater than about 10r"
return Math.
abs(chiSquare
- r
) <= 2 * Math.
sqrt(r
); }
/**
* @param nums an array of integers
* @return a Map, key being the number and value its frequency
*/
private static Map
<Number, Integer
> getFrequencies
(ArrayList
<? extends Number
> nums
) { Map
<Number, Integer
> freqs
= new HashMap
<Number, Integer
>();
if (freqs.containsKey(x)) {
freqs.put(x, freqs.get(x) + 1);
} else {
freqs.put(x, 1);
}
}
return freqs;
}
{
testRandomNumbers(30);
testRandomNumbers(100);
testRandomNumbers(200);
testRandomNumbers(1000);
}
}