实现随机发生器的MWC算法

时间:2015-02-08 16:45:34

标签: c# random

我在大学的一位教授告诉我们要写一个随机发生器。 他说这是功能:x[i] = (a*x[i-1] + c) Mod m 如果你的系统是64位,则m是(2^63) - 1

他写了这个伪代码:(MWC算法)

a = 65539; x[0] = 65539; m = (2^63) -1;
x[i] = ax[i-1];
if x[i] < 0
    then  x[i] = x[i] + m;
    else R[i]  = x[i] /m;
end if

我试图在c#中实现它。这是我写的代码:

  using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Threading.Tasks;

  namespace Random_Generator
  {
      class Program
      {
          static void Main(string[] args)
          {           
               float a = 65539;
               float[] x = new float[100];
               x[0] = 65539;
               float m = (float)  Math.Pow(2,63) - 1;
               for(int i = 1; i < 100; i++)
               {
                    x[i] = (a ) * x[i - 1];

                    if (x[i] < 0)
                        x[i] = x[i ] +  m;

                    Console.WriteLine("Random Number {0} is {1}", i, (float)(x[i]/m));
               }
         }
      }
 }

正如他所说,它应该生成m随机唯一数字。但是当我运行此代码时,只有前62个数字正确生成。之后生成的所有数字都是infinite

我真的无法找到问题,我真的需要它。

任何人都可以帮帮我吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您不需要使用float作为基本类型,您需要使用{c}中的long表示64位有符号整数。

试试这段代码:

static void Main(string[] args)
{           
    long a = 65539;
    long[] x = new long[100];
    x[0] = 65539;
    long m = long.MaxValue; // equals to 2^63-1
    for(int i = 1; i < x.Length; i++)
    {
        x[i] = a * x[i - 1];

        if (x[i] < 0)
            x[i] = x[i] + m;
        else
            Console.WriteLine("Random Number {0} is {1}", i, x[i]/(float)m);
    }
}

我不确定这是真正的MWC算法,但它会生成100个不同的浮点数。