我需要在Lua中从一个种子生成一组随机数,然后从相同的种子在C#中生成相同的随机数集,有什么最好的方法?
要生成相同的随机数,您需要使用相同的代码。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);
}