2016-08-17 11 views
2

同じランダムシードを使用してデッキ内のカードをシャッフルしようとしていますので、デッキはランダムになりますが、両方のクライアントで同期されます。私は、同じマシン上で私のカードゲームの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)になります。

+0

メルセンヌツイスターを使用した場合、現在のシードを単に共有するだけで、両方とも同じ値のシーケンスが生成されます。ところで、それは不完全なシャッフラーです。 – Plutonix

+0

@Plutonix不完全なシャッフラーは何ですか? Mersenne TwisterがC#に組み込まれていますか? –

+0

これは欠陥があります。後続のアイテムが移動されたときに考慮しないことで、各アイテムを1回だけ移動させる必要があります。 – Plutonix

答えて

3

これを行うには、両方のマシンが同じ乱数ジェネレーターの同じ種子を使用していることを確認する必要があります。 Randomクラスの異なるバージョンが同じアルゴリズムを使用するという保証はありません。

したがって、独自の乱数ジェネレータクラスを開発し、System.Randomの代わりに使用する必要があります。

+0

それは悪臭。なぜSystem.Randomが違うのでしょうか?おかげで私の質問にはかなり答えることができますが、ランダムなクラスを作る方法はわかりません。 –

+2

@SethKitchen:バグを見つけたのはなぜか、より速いアルゴリズムを思いついたのかもしれません。自分で作ることについては、既存の 'System.Random'のソースをhttp://referencesource.microsoft.com/#mscorlib/system/random.cs,bb77e610694e64caから入手し、コードをコピーしてくださいあなたのプロジェクトでは、名前を 'MyRandom'に変更し、コード内で' System.Random'を使う場所はどこでも 'MyRandom'を参照してください。または、いくつかの研究を行い、独自の擬似乱数ジェネレータを開発することができます。それほど難しいことではありません。 –

+0

ロックありがとう! 6分で承諾します –

関連する問題