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

How to use the same random seed between Windows Devices?

我正在尝试使用相同的随机种子在一副牌中洗牌,这样牌组将是随机的,但在两个客户端上同步。我正在使用以下随机播放算法:

    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 模拟器中,卡片使用相同的种子,但卡片不同步。有没有办法洗牌并让它们在多个客户端之间同步?

所谓同步,是指它们以完全相同的方式随机播放。 IE 当我 运行 两个客户端第一次使用四张牌 (a,b,c,d) 时,两个客户端的套牌顺序都是 (b,c,a,d)。当我第二次 运行 客户时,两个客户的甲板订单都是 (c,d,a,b)。

为此,您需要确保两台机器都使用完全相同的种子相同的随机数生成器。无法保证 Random class 的不同版本将使用相同的算法。

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

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

一个简单的 52 张牌洗牌可以占用少至 29 个字节或(更实际的)52 个字节,大多数应用程序可能认为这是 "not much"。在我看来,store the shuffled deck, in this case, rather than the seed 是一个更好的主意,除非您的应用程序向您的用户显示一个代码,供您的玩家重新生成洗牌后的牌组。这样,您就不必将应用程序绑定到特定的 RNG(例如 System.Random)。