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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Windows设备之间使用相同的随机种子?相关的知识,希望对你有一定的参考价值。

我试图使用相同的随机种子在牌组中洗牌,因此牌组将是随机的,但在两个客户端同步。我使用以下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模拟器中运行时,这些卡使用相同的种子,但是卡片未同步。反正有没有洗牌并让它们同步到多个客户端?

通过Synced,我的意思是他们以完全相同的方式洗牌。 IE当我第一次用两张卡(a,b,c,d)运行两个客户端时,两个客户端的套牌顺序是(b,c,a,d)。当我第二次运行客户端时,两个客户端上的套牌订单是(c,d,a,b)。

答案

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

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

另一答案

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

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

以上是关于如何在Windows设备之间使用相同的随机种子?的主要内容,如果未能解决你的问题,请参考以下文章

用C语言如何实现多线程同时运行的情况下,各个线程输出不同的随机数?

Random库用法详解

PyTorch DataLoader 对并行运行的批次使用相同的随机种子

如何使用 TensorFlow 获得稳定的结果,设置随机种子

RND函数怎么用

火花随机森林:相同种子的不同结果