Delphi的随机生成器与C#的计算方法是否相同?

Glu*_*nds 8 c# delphi random

当我碰到这个时,我正在将一些Delphi代码翻译成c#代码.我没有Delphi的环境设置,所以我不能自己测试它.

德尔福:

RandSeed := var1;
Result := Random($FF);
Run Code Online (Sandbox Code Playgroud)

C#:

Random RandSeed = new Random(var1);
Result = RandSeed.Next(255);
Run Code Online (Sandbox Code Playgroud)

这些会在结果中使用相同的值吗?如果没有,有什么想法可以这么做吗?

Bar*_*lly 17

Delphi PRNG是一个确定性线性同余生成器,134775813为a1和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));
    }
}
Run Code Online (Sandbox Code Playgroud)


sch*_*der 7

当然不是,因为他们使用不同的RNG.您也许可以使用Windows API中的RNG,创建自己的RNG或使用一些RNG库来实现此目的.

另一种确保RNG为给定种子创建相同数字的方法是编写DLL并将其用于Delphi和C#.

顺便说一句,如果你想自己编写一个RNG代码,维基百科是获得一些常用生成器名称的一个很好的起点.完成后,您应该通过一些统计测试来确保它对您来说是"随机"的.