/* 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()
  {
    Random random = new Random();
    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);
    //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>();

    for (Number x : nums) {
      if (freqs.containsKey(x)) {
        freqs.put(x, freqs.get(x) + 1);
      } else {
        freqs.put(x, 1);
      }
    }

    return freqs;
  }

	public static void main (String[] args) throws java.lang.Exception
	{
		System.out.print("  30: ");
		testRandomNumbers(30);
		System.out.print(" 100: ");
		testRandomNumbers(100);
		System.out.print(" 200: ");
		testRandomNumbers(200);
		System.out.print("1000: ");
		testRandomNumbers(1000);
	}
}