同じランダムシードを使用してデッキ内のカードをシャッフルしようとしていますので、デッキはランダムになりますが、両方のクライアントで同期されます。私は、同じマシン上で私のカードゲームの2つのインスタンスを実行すると予想されるように、カードが両方のクライアントにシャッフルし、同期されWindowsデバイス間で同じランダムシードを使用するにはどうすればよいですか?
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の場合、両方のクライアントで最初に4つのカード(a、b、c、d)を実行すると、デッキの順序は(b、c、a、d)となります。私がクライアントを2回目に実行すると、両方のクライアントでデッキ順序が(c、d、a、b)になります。
メルセンヌツイスターを使用した場合、現在のシードを単に共有するだけで、両方とも同じ値のシーケンスが生成されます。ところで、それは不完全なシャッフラーです。 – Plutonix
@Plutonix不完全なシャッフラーは何ですか? Mersenne TwisterがC#に組み込まれていますか? –
これは欠陥があります。後続のアイテムが移動されたときに考慮しないことで、各アイテムを1回だけ移動させる必要があります。 – Plutonix