【问题标题】:How to generate a set of random numbers in both Lua and C# that are the same?如何在 Lua 和 C# 中生成一组相同的随机数?
【发布时间】:2015-06-28 19:05:25
【问题描述】:

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

【问题讨论】:

    标签: c# random lua


    【解决方案1】:

    您需要相同的代码来生成相同的随机数。 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】:

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

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

      因此,您最可靠的方法是选择 an algorithm 并在两个平台上自行实现。然后你只需要一个通用种子来生成相同的序列。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-07
        • 1970-01-01
        • 2015-09-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多