我正在尝试使用相同的随机种子在卡片中随机播放卡片,因此卡片将是随机的,但在两个客户端上同步。我使用以下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)。
答案 0 :(得分:3)
为此,您需要确保两台计算机使用完全相同的种子和相同的随机数生成器。不能保证Random
类的不同版本将使用相同的算法。
因此,您需要开发自己的随机数生成器类,并使用它而不是System.Random
。
答案 1 :(得分:0)
我只想在这里添加自己的答案。
一个简单的52卡洗牌可以占用29个字节,或者(实际上)是52个字节,大多数应用程序可能认为这不多。在我看来,store the shuffled deck, in this case, rather than the seed是一个更好的主意,除非您的应用程序向您的用户显示了一个代码,让您的玩家重新生成乱码的牌组。这样,您就不必将应用程序绑定到特定的RNG(例如System.Random
)。