如何在Lua和C#中生成一组相同的随机数?

3

我需要在Lua中从一个种子生成一组随机数,然后从相同的种子在C#中生成相同的随机数集,有什么最好的方法?

2个回答

4

要生成相同的随机数,您需要使用相同的代码。Lua库简单明了,并将任务传递给C运行时库。这使得如果您也使用它,有一定可能会得到相同的数字。使用pinvoke很容易:

using System.Runtime.InteropServices;
...
    public static double LuaRandom() {
        const int RAND_MAX = 0x7fff;
        return (double)(rand() % RAND_MAX) / RAND_MAX;
    }

    public static void LuaRandomSeed(int seed) {
        srand(seed);
    }

    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern int rand();
    [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl)]
    private static extern void srand(int seed);

编写一个小的测试程序,使用Lua和C#编写,确保使用LuaRandomSeed()和math.randomseed()使它们从相同的序列开始,并比较它们输出的前25个数字。如果没有匹配,则表示您的Lua实现正在使用不同的C运行时库,您将需要编写自己的随机数生成器。Microsoft使用的简单LCG:

private static uint seed;

public static int rand() {
    seed = seed * 214013 + 2531011;
    return (int)((seed >> 16) % RAND_MAX);
}

1
你需要2个使用相同算法和参数的随机生成器。
.NET框架对生成器没有任何保证(即它可能在未来版本中更改)。我不太了解Lua,但它可能有一个基于实现平台的标准生成器,具有类似的不确定性。
因此,你最可靠的做法是选择一种算法,并在两个平台上自己实现它。然后,你只需要一个公共种子来生成相同的序列。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接