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