如何在Windows设备之间使用相同的随机种子

本文关键字:种子 随机 之间 Windows | 更新日期: 2023-09-27 18:02:45

我正在尝试洗牌在甲板上使用相同的随机种子,所以甲板将是随机的,但同步在两个客户端。我正在使用以下shuffle算法:

    internal void ShuffleDeck(int randomSeed)
    {
        _random = new Random(randomSeed);
        Cards.Card[] toShuffle = CardsInDeck.ToArray();
        Shuffle<Cards.Card>(toShuffle);
        CardsInDeck = toShuffle.ToList<Cards.Card>();
    }
    /// <summary>
    /// Shuffle the array.
    /// </summary>
    /// <typeparam name="T">Array element type.</typeparam>
    /// <param name="array">Array to shuffle.</param>
    private static void Shuffle<T>(T[] array)
    {
        int n = array.Length;
        for (int i = 0; i < n; i++)
        {
            // NextDouble returns a random number between 0 and 1.
            // ... It is equivalent to Math.random() in Java.
            int r = i + (int)(_random.NextDouble() * (n - i));
            T t = array[r];
            array[r] = array[i];
            array[i] = t;
        }
    }

当我在同一台机器上运行我的纸牌游戏的两个实例时,卡片在两个客户端上按预期进行洗牌和同步,但是当我在我的计算机上运行一个实例并在HoloLens模拟器中运行另一个实例时,卡片使用相同的种子,但卡片不同步。是否存在洗牌并在多个客户端之间同步的方法?

我说的同步是指它们以完全相同的方式进行洗牌。例如,当我第一次用四张牌(a,b,c,d)运行两个客户端时,两个客户端的牌序是(b,c,a,d)。当我第二次运行客户端时,两个客户端的甲板顺序都是(c,d,a,b)。

如何在Windows设备之间使用相同的随机种子

为了做到这一点,您需要确保两台机器使用完全相同的种子相同的随机数生成器。不能保证不同版本的Random类会使用相同的算法。

因此,您需要开发自己的随机数生成器类,并使用它来代替System.Random

我只是想在这里加上我自己的答案。

一次简单的52张牌洗牌只需29字节或(更实际的)52字节,大多数应用程序可能认为这"不多"。在我看来,在这种情况下,最好存储洗牌,而不是种子,除非您的应用程序向用户显示玩家重新生成洗牌的代码。这样,您就不必将应用程序绑定到特定的RNG(如System.Random)。