for WPF developers
Home Profile Tips 全記事一覧

範囲設定に注意

(2016/12/03 0:42:30 created.)

前節のサンプルのように、整数の乱数を取得するときは Next() メソッドを使用します。このとき、次のように発生させる乱数に範囲を指定することもできます。ただし、その設定方法に注意が必要です。

Program.cs
  1. namespace Tips_Random
  2. {
  3.     using System;
  4.     using System.Linq;
  5.  
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             var rand = new Random();
  11.  
  12.             #region 範囲設定に注意
  13.             Console.WriteLine("Random.Next(min, max) で得られる数値は min ≦ x < max となる。");
  14.             Console.WriteLine("最小値 min は含まれるが、最大値 max は含まれないことに注意しないといけない。");
  15.             Console.WriteLine("例えば [0, 10000) を指定する場合は Random.Next(0, 10000) と指定する。");
  16.             var values = Enumerable.Range(0, 1000000).Select(_ => rand.Next(0, 10000)).ToArray();
  17.             Console.WriteLine(string.Join(Environment.NewLine, new string[]
  18.                 {
  19.                     "[    0] = " + values.Count(x => x == 0),
  20.                     "[    1] = " + values.Count(x => x == 1),
  21.                     "[    2] = " + values.Count(x => x == 2),
  22.                     "[ 9997] = " + values.Count(x => x == 9997),
  23.                     "[ 9998] = " + values.Count(x => x == 9998),
  24.                     "[ 9999] = " + values.Count(x => x == 9999),
  25.                     "[10000] = " + values.Count(x => x == 10000),
  26.                 }));
  27.             Console.WriteLine();
  28.             Console.ReadKey();
  29.             #endregion 範囲設定に注意
  30.         }
  31.     }
  32. }

このコード例では 0 から 10000 までの範囲を指定していますが、数式で書くと 0 ≦ x < 10000 というように、最大値は含まれないことになります。もし 10000 も乱数として発生させたい場合は Next(0, 10001) というように書かなければいけません。

コードの後半では発生させた値の中から0、1、2、9997、9998、9999、10000 となった個数をカウントして表示させています。10000 という値がひとつも発生していないことがわかります。