我在大学的一位教授告诉我们要写一个随机发生器。
他说这是功能: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
。
我真的无法找到问题,我真的需要它。
任何人都可以帮帮我吗?提前谢谢。
答案 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个不同的浮点数。