【发布时间】:2015-06-28 19:05:25
【问题描述】:
我需要从 Lua 中的种子生成一组随机数,然后在 c# 中从同一个种子生成相同的随机数集,最好的方法是什么?
【问题讨论】:
我需要从 Lua 中的种子生成一组随机数,然后在 c# 中从同一个种子生成相同的随机数集,最好的方法是什么?
【问题讨论】:
您需要相同的代码来生成相同的随机数。 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 运行时库,你必须编写自己的随机数生成器。微软使用的简单 LCG:
private static uint seed;
public static int rand() {
seed = seed * 214013 + 2531011;
return (int)((seed >> 16) % RAND_MAX);
}
【讨论】:
您需要 2 个使用相同算法和参数的随机生成器。
.NET 框架不保证生成器的任何内容(即它可能会在未来的版本中更改)。我对 Lua 了解不多,但它可能有一个基于实现平台的标准生成器,具有类似的变幻莫测。
因此,您最可靠的方法是选择 an algorithm 并在两个平台上自行实现。然后你只需要一个通用种子来生成相同的序列。
【讨论】: