2016-08-17 4 views
2

Ich versuche, Karten in einem Deck mit demselben Zufallssamen zu mischen, so dass die Decks zufällig sind, aber auf beiden Clients synchronisiert werden. Ich verwende den folgenden Shuffle-Algorithmus:Wie verwende ich den gleichen Random Seed zwischen Windows-Geräten?

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; 
     } 
    } 

Als ich zwei Instanzen meiner Kartenspiel auf der gleichen Maschine laufen, werden die Karten neu gemischt und auf beiden Clients synchronisiert, wie erwartet, aber wenn ich laufe eine Instanz auf meinem Computer und eine andere in einem HoloLens-Emulator, die Karten verwenden den gleichen Samen, aber Karten werden nicht synchronisiert. Gibt es die Karten trotzdem zu mischen und sie über mehrere Clients synchronisieren zu lassen?

Von Synced, ich meine, sie sind genau auf die gleiche Weise gemischt. IE wenn ich beide Clients das erste Mal mit vier Karten (a, b, c, d) betreibe, ist die Deckreihenfolge (b, c, a, d) auf beiden Clients. Wenn ich die Clients das zweite Mal ausführen, ist die Deckreihenfolge auf beiden Clients (c, d, a, b).

+0

Wenn Sie einen Mersenne Twister verwenden, können Sie einfach den aktuellen Seed teilen und beide würden die gleiche Folge von Werten erzeugen. BTW, das ist ein unvollkommener Shuffler. – Plutonix

+0

@Plutonix Was ist ein unvollständiger Shuffler? Ist ein Mersenne Twister in C# eingebaut? –

+0

Es ist fehlerhaft - es sollte jeden Gegenstand einmal und nur einmal bewegen, indem man es nicht berücksichtigt, wenn nachfolgende Gegenstände bewegt werden. – Plutonix

Antwort

3

Um dies zu tun, müssen Sie sicherstellen, dass beide Maschinen die gleichen Samen und den gleichen Zufallsgenerator verwenden. Es gibt keine Garantie, dass verschiedene Versionen der Klasse Random denselben Algorithmus verwenden.

Sie müssen also Ihre eigene Zufallszahlengeneratorklasse entwickeln und sie anstelle von System.Random verwenden.

+0

Das stinkt. Warum sollte System.Random anders sein? Danke, das beantwortet meine Frage so ziemlich, aber ich habe keine Ahnung, wie man eine zufällige Klasse erstellt ... –

+2

@SethKitchen: Warum es sich ändern würde, könnte sein, dass sie einen Fehler gefunden haben, oder dass sie einen schnelleren Algorithmus entwickelt haben. Wie für Ihre eigenen, eine Sache, die Sie tun könnten, ist, die Quelle für die vorhandene "System.Random" von http://referencesource.microsoft.com/#mscorlib/system/random.cs,bb77e610694e64ca, kopieren Sie den Code Ändern Sie den Namen Ihres Projekts in "MyRandom" und verweisen Sie dann, wo immer Sie "System.Random" in Ihrem Code verwenden, auf "MyRandom". Oder Sie könnten etwas recherchieren und Ihren eigenen Pseudozufallszahlengenerator entwickeln. Es ist nicht so schwer. –

+0

Danke, dass du rockt! Wird in 6 Minuten akzeptiert –

Verwandte Themen