当我遇到这个时,我正在将一些Delphi代码翻译成c#代码.我没有Delphi的环境设置,所以我不能自己测试它.
德尔福:
RandSeed := var1; Result := Random($FF);
C#:
Random RandSeed = new Random(var1); Result = RandSeed.Next(255);
这些在Result中会有相同的值吗?如果没有,有什么想法可以这么做吗?
解决方法
Delphi PRNG是一个确定性的
linear congruential generator,其中134775813为a,1为c,并返回高32位的范围限制数.这是C#中的一个实现,返回与Delphi相同的值:
using System;
class DelphiRandom
{
int _seed;
public DelphiRandom(int seed)
{
_seed = seed;
}
int GetNext() // note: returns negative numbers too
{
_seed = _seed * 0x08088405 + 1;
return _seed;
}
public int Next(int maxValue)
{
ulong result = (ulong) (uint) GetNext() * (ulong) (uint) maxValue;
return (int) (result >> 32);
}
}
class App
{
static void Main()
{
DelphiRandom r = new DelphiRandom(42);
for (int i = 0; i < 10; ++i)
Console.WriteLine(r.Next(100));
}
}