fork download
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. class Program
  6. {
  7. /// <summary>
  8. /// 指定した範囲内の度数分布表を作成します。
  9. /// </summary>
  10. /// <remarks>
  11. /// <paramref name="buckets"/>は1以上の値が与えられるものとします。
  12. /// <paramref name="max"/>は<paramref name="min"/>より大きな値が与えられるものとします。
  13. /// </remarks>
  14. /// <param name="data">度数分布表を作成するデータ。</param>
  15. /// <param name="buckets">作成する度数分布表の階級数(区間の数)。</param>
  16. /// <param name="min">作成する度数分布表の最小値。
  17. /// この値以上のデータを集計し、この値未満のデータは無視します。</param>
  18. /// <param name="max">作成する度数分布表の最大値。
  19. /// この値未満のデータを集計し、この値以上のデータは無視します。</param>
  20. /// <returns>累積度数の配列。長さは<paramref name="buckets"/>。</returns>
  21. private static int[] CreateHistogram(IEnumerable<double> data, int buckets, double min, double max)
  22. {
  23. // 累積度数の配列を作成。
  24. int[] results = new int[buckets];
  25. // 階級幅の逆数を計算。
  26. double multiplier = buckets / (max - min);
  27. foreach (double datum in data)
  28. {
  29. // 幅で割って(=幅の逆数を掛けて)整数化。
  30. int index = (int)((datum - min) * multiplier);
  31. // 度数分布表の範囲に収まっていたら度数をカウントアップ。
  32. if (0 <= index && index < buckets)
  33. results[index] += 1;
  34. }
  35. return results;
  36. }
  37.  
  38. static void Main()
  39. {
  40. var r = new Random();
  41. // 0以上100未満のランダムな数を100000個生成。
  42. var data = Enumerable.Repeat(0, 100000).Select(x => 100.0d * r.NextDouble());
  43. // 10以上20未満の区間を10個に分割した度数分布表を作成。
  44. var hist = CreateHistogram(data, 10, 10.0d, 20.0d);
  45. for (var i = 0; i < hist.Length; i++)
  46. Console.WriteLine("{0,2}: {1}", i, hist[i]);
  47. }
  48. }
Success #stdin #stdout 0.05s 38032KB
stdin
Standard input is empty
stdout
 0: 1988
 1: 996
 2: 969
 3: 1050
 4: 980
 5: 1001
 6: 1037
 7: 1031
 8: 1012
 9: 1056