如何在 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
)。
我正在尝试使用相同的随机种子在一副牌中洗牌,这样牌组将是随机的,但在两个客户端上同步。我正在使用以下随机播放算法:
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
)。