fork download
  1. /* package whatever; // don't place package name! */
  2.  
  3. import java.util.*;
  4. import java.lang.*;
  5. import java.io.*;
  6.  
  7. class Ideone
  8. {
  9.  
  10. public static class User
  11. {
  12. public static final int MINIT = 20;
  13. public static final int MAXIT = 50;
  14. private int iterations;
  15.  
  16. //private static Random random = new Random();
  17.  
  18. public void setIterations()
  19. {
  20. Random random = new Random();
  21. setIterations(MINIT+random.nextInt(MAXIT-MINIT));
  22. }
  23.  
  24. private void setIterations(int iterations) {
  25. this.iterations = iterations;
  26. }
  27. public int getIterations() {
  28. return iterations;
  29. }
  30. }
  31.  
  32. private static User user = new User();
  33.  
  34. public static void testRandomNumbers(int SIZE) {
  35. final int TIMES = 30;
  36. int results = 0;
  37. for(int i = 0; i < TIMES; i++)
  38. {
  39. if (randomNumbersRun(SIZE))
  40. {
  41. results++;
  42. }
  43. }
  44. System.out.println(results);
  45. //System.out.println(results >= TIMES * 80 / 100);
  46. }
  47.  
  48. private static boolean randomNumbersRun(int SIZE)
  49. {
  50. ArrayList<Integer> list = new ArrayList<Integer>();
  51. int r = User.MAXIT - User.MINIT;
  52. //final int SIZE = 11;
  53. for (int i = 0; i < r*SIZE; i++) {
  54. user.setIterations();
  55. list.add(user.getIterations());
  56. }
  57. return isRandom(list, r);
  58. }
  59.  
  60. public static boolean isRandom(ArrayList<? extends Number> randomNums, int r) {
  61. //According to Sedgewick: "This is valid if N is greater than about 10r"
  62. if (randomNums.size() <= 10 * r) {
  63. return false;
  64. }
  65.  
  66. //PART A: Get frequency of randoms
  67. Map<Number, Integer> ht = getFrequencies(randomNums);
  68.  
  69. //PART B: Calculate chi-square - this approach is in Sedgewick
  70. double n_r = (double) randomNums.size() / r;
  71. double chiSquare = 0;
  72.  
  73. for (int v : ht.values()) {
  74. double f = v - n_r;
  75. chiSquare += f * f;
  76. }
  77. chiSquare /= n_r;
  78.  
  79. //PART C: According to Swdgewick: "The statistic should be within 2(r)^1/2 of r
  80. //This is valid if N is greater than about 10r"
  81. return Math.abs(chiSquare - r) <= 2 * Math.sqrt(r);
  82. }
  83.  
  84. /**
  85.   * @param nums an array of integers
  86.   * @return a Map, key being the number and value its frequency
  87.   */
  88. private static Map<Number, Integer> getFrequencies(ArrayList<? extends Number> nums) {
  89. Map<Number, Integer> freqs = new HashMap<Number, Integer>();
  90.  
  91. for (Number x : nums) {
  92. if (freqs.containsKey(x)) {
  93. freqs.put(x, freqs.get(x) + 1);
  94. } else {
  95. freqs.put(x, 1);
  96. }
  97. }
  98.  
  99. return freqs;
  100. }
  101.  
  102. public static void main (String[] args) throws java.lang.Exception
  103. {
  104. System.out.print(" 30: ");
  105. testRandomNumbers(30);
  106. System.out.print(" 100: ");
  107. testRandomNumbers(100);
  108. System.out.print(" 200: ");
  109. testRandomNumbers(200);
  110. System.out.print("1000: ");
  111. testRandomNumbers(1000);
  112. }
  113. }
Success #stdin #stdout 0.7s 380160KB
stdin
Standard input is empty
stdout
  30: 26
 100: 25
 200: 27
1000: 29