for WPF developers
Home Profile Tips 全記事一覧

最下位ビットも乱数として扱える

(2016/12/03 0:47:37 created.)

乱数発生のアルゴリズムによっては、偶数と奇数が必ず交互に現れてしまうものもあります。そうしたとき、最下位ビットは必ず 0 と 1 が交互になるため、乱数として扱うことができません。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 偶数か奇数か
  13.             for (var i = 0; i < 100; i++)
  14.             {
  15.                 Console.WriteLine(rand.Next() % 2 == 0 ? "1" : "0");
  16.             }
  17.             Console.WriteLine("偶数の後は必ず奇数であったり、奇数の後は必ず偶数であったりすることはなさそうだ。");
  18.             Console.WriteLine("つまり最下位ビットも乱数として扱えるということ。");
  19.             Console.WriteLine("odds = " + Enumerable.Range(0, 100).Select(_ => rand.Next() % 2).Sum());
  20.             Console.WriteLine("");
  21.             Console.ReadKey();
  22.             #endregion 偶数か奇数か
  23.         }
  24.     }
  25. }

このコードでは、乱数を発生させて偶数なら 1、奇数なら 0 として表示させています。結果を見ると 0 と 1 が必ず交互になっているわけではなく、不規則であることがうかがえます。また、奇数の個数を数えると 100 個中およそ半分となっており、やはり一様分布であることがうかがえます。