fork download
  1. // Eric LippertのクイズをC#からJavaに移植
  2. // http://b...content-available-to-author-only...n.com/b/ericlippert/archive/2012/02/24/a-simple-puzzle.aspx
  3. // http://d...content-available-to-author-only...e.jp/matarillo/20120226/p1
  4.  
  5. import java.util.Random;
  6.  
  7. class Main {
  8. /**
  9.   * 指定した範囲内の度数分布表を作成します。
  10.   * bucketsには1以上の値が与えられるものとします。
  11.   * maxにはminより大きな値が与えられるものとします。
  12.   * @param data 度数分布表を作成するデータ。
  13.   * @param buckets 作成する度数分布表の階級数(区間の数)。
  14.   * @param min 作成する度数分布表の最小値。この値以上のデータを集計し、この値未満のデータは無視します。
  15.   * @param max 作成する度数分布表の最大値。この値未満のデータを集計し、この値以上のデータは無視します。
  16.   * @return 累積度数の配列。長さはbuckets。
  17.   */
  18. private static int[] createHistogram(double[] data, int buckets, double min, double max) {
  19. // 累積度数の配列を作成。
  20. int[] results = new int[buckets];
  21. // 階級幅の逆数を計算。
  22. double multiplier = buckets / (max - min);
  23. for (double datum : data)
  24. {
  25. // 幅で割って(=幅の逆数を掛けて)整数化。
  26. int index = (int)((datum - min) * multiplier);
  27. // 度数分布表の範囲に収まっていたら度数をカウントアップ。
  28. if (0 <= index && index < buckets)
  29. results[index] += 1;
  30. }
  31. return results;
  32. }
  33.  
  34. public static void main(String[] args) {
  35. Random r = new Random();
  36. // 0以上100未満のランダムな数を100000個生成。
  37. double[] data = new double[100000];
  38. for (int i = 0; i < data.length; i++)
  39. data[i] = 100.0 * r.nextDouble();
  40. // 10以上20未満の区間を10個に分割した度数分布表を作成。
  41. int[] hist = createHistogram(data, 10, 10.0, 20.0);
  42. for (int i = 0; i < hist.length; i++)
  43. System.out.println(i + ": " + hist[i]);
  44. }
  45. }
Success #stdin #stdout 0.11s 212544KB
stdin
Standard input is empty
stdout
0: 2020
1: 994
2: 1029
3: 971
4: 1040
5: 1055
6: 978
7: 992
8: 1013
9: 1015