为随机生成器实现 MWC 算法

Implementing MWC algorithm for Random generator

我的一位大学教授告诉我们写一个随机生成器。 他说是这个函数: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.

实在是找不到问题,又真的需要。

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

你不需要使用 float 作为你的基类型,你需要使用 long 在 c# 中表示 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 个不同的浮点数。