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

时间:2015-06-28 10:40:02

标签: c# random lua

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

2 个答案:

答案 0 :(得分:4)

您需要相同的代码才能生成相同的随机数。 Lua库并不复杂,并将作业传递给C runtime library。如果你也使用它,你可能会获得相同的数字。使用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 :(得分:1)

您需要使用相同算法和参数的2个随机生成器。

.NET框架不保证生成器的任何内容(即它可能在将来的版本中更改)。我对Lua知之甚少,但它可能有一个基于具有类似变幻莫测的实现平台的标准生成器。

因此,您最可靠的课程是选择an algorithm并在两个平台上自行实施。然后你需要的只是一个共同的种子来产生相同的序列。