for WPF developers
Home Profile Tips 全記事一覧

シードについて

(2016/12/03 0:39:58 created.)

乱数を生成するための基となるものがシードと呼ばれる数値です。同じシードが与えられるとまったく同じ数列を返すため、ランダムといえど再現性を求める場合はシードとして使用する数値ひとつを保存しておくことで対応できそうです。

デフォルトのシードは System.Environment.TickCount プロパティ、つまり CPU カウントによる時刻の値が指定されます。この TickCount はミリ秒単位であるため、ミリ秒より高速な処理の中で System.Random クラスをインスタンス化してしまうと、まったく同じ数値を返してしまうため、乱数生成器としての役割を果たせません。

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 seed
  13.             for (var i = 0; i < 100; i++)
  14.             {
  15.                 Console.WriteLine(i + ":" + new Random().Next());
  16.             }
  17.             Console.WriteLine("Random クラスのコンストラクタに特に指定しない場合、Seed は Environment.TickCount となる。");
  18.             Console.WriteLine("そのため、ミリ秒より速い処理で Random クラスをインスタンス化すると");
  19.             Console.WriteLine("Seed が同じものになってしまうため、同じ値しか返ってこない。");
  20.             Console.WriteLine();
  21.             Console.ReadKey();
  22.  
  23.             for (var i = 0; i < 100; i++)
  24.             {
  25.                 Console.WriteLine(i + ":" + rand.Next());
  26.             }
  27.             Console.WriteLine("同一インスタンスで Next() メソッドを使えば高速処理でもランダムな値が得られる。");
  28.             Console.WriteLine();
  29.             Console.ReadKey();
  30.             #endregion seed
  31.         }
  32.     }
  33. }

for 文の内側でインスタンス化した場合、いくつか同じ数値が並んでしまいます。

for 文の外側でインスタンス化した場合、毎回異なる数値が並ぶようになります。