当我遇到这个时,我正在将一些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)); } }