Funktioniert meine Methode effektiv?

7

Ich schreibe einen Code für ein Kartenspiel, das das Kartenspiel mischt. Ich habe den Code getestet, aber ich weiß nicht wirklich, ob er tatsächlich das tut, was er richtig machen soll? Was denkst du?

Dies ist der Code für die Shuffle-Methode:

%Vor%

Meine Ausgabe scheint in ihren Zahlen gemischt zu sein, aber nicht mit dem Namen der Karte wie Pikherzen etc,

Zum Beispiel ist dies meine Ausgabe, wenn ich den Code teste:

%Vor%

Wie es immer wieder Namen gibt. ist es falsch, da der Punkt des Mischens ist, es zu verwechseln?

Das ist die eigentliche Frage: Beim Kartenspielen ist es natürlich wichtig, das Deck zu mischen, also zu Ordne die Dinge so an, dass die Karten in zufälliger Reihenfolge ausgeteilt werden. Es gibt mehrere Möglichkeiten, dies zu erreichen. Eine Strategie beinhaltet das wiederholte Auswählen einer Karte zufällig aus dem Deck und bewegte es bis zum Ende. Der folgende Code verwendet Die Random - Klasse (die Sie auf Seite 8 des Abschnitts "ArrayLists" der Online-Kurs), um eine solche Operation "Wählen und zum Ende gehen" durchzuführen:

%Vor%

Um das Deck effektiv zu mischen, sollte dieser Vorgang viele Male wiederholt werden (Sagen wir 500 mal). Erstellen Sie eine neue Instanzmethode shuffle für die Deck-Klasse Das verwendet ein einzelnes Random-Objekt und eine for-Schleife, um myDeck zu mischen. Nach Ändern Sie die Hauptmethode entsprechend, verwenden Sie sie, um Ihren neuen Code zu testen.

Meine Hauptfrage ist also: mache ich das falsch?

    
Panthy 06.08.2012, 21:01
quelle

4 Antworten

16

Ändere einfach rn.nextInt(52); in rn.nextInt(x) und du hast eine richtige Fisher-Yates Shuffle . Keine Notwendigkeit, mehr als 52 Iterationen zu machen.

Warum das funktioniert:

  • In der ersten Iteration (wenn x 52 ist) wählst du eine zufällige Karte aus dem vollen Deck aus und bewegst sie zuletzt.

  • In der zweiten Iteration (wenn x 51 ist) wählst du eine zufällige Karte aus den verbleibenden Karten aus und bewegst sie zuletzt.

    ... und so weiter.

  • Nach 52 Iterationen ist die erste ausgewählte Karte im ersten Index gelandet. Da diese Karte zufällig aus dem vollen Kartenstapel ausgewählt wurde, ist jede Karte gleich wahrscheinlich.

  • Gleiches gilt für den zweiten Index, den dritten Index, ...

  • Daraus folgt, dass jede mögliche Permutation des Decks gleichermaßen wahrscheinlich ist.


(Im Produktionscode verwenden Sie einfach Collections.shuffle in diesen Situationen.)

    
aioobe 06.08.2012, 21:05
quelle
2

Am besten verwenden Sie dazu die integrierte Methode Collections.shuffle() , mit der Sie Ihre ArrayList auf zufällige Weise (oder nahezu zufällig) mischen.

Das Problem mit Ihrer Logik im Moment ist, dass es eine zufällige Karte aus dem Deck auswählt und sie auf das Ende setzt - und das 52 Mal. Jetzt haben Sie eine gute Änderung, dass Sie am Ende mehrere Karten, und einige überhaupt nicht tun werden - daher das Problem, das Sie mit vielen Karten bekommen, die anscheinend nicht randomisiert wurden / p>

Sie scheinen die Logik zu haben, die Sie für die Anzahl der Karten im Deck benötigen, die fehlerhaft sind. Sie müssen es viel öfter durchführen.

Sie haben zwei logische Hauptlösungen. Sie könnten dies zunächst viel öfter tun - sagen Sie 10 Mal mehr als Sie derzeit tun, oder Sie könnten Ihren Code neu programmieren, um einen eingebauten (oder effektiveren) Code zu verwenden ) Mischalgorithmus.

    
berry120 06.08.2012 21:06
quelle
1

Die Frage gibt einen Hinweis:

  

Um das Deck effektiv zu mischen, sollte dieser Vorgang viele Male wiederholt werden (zB 500 mal).

Während Ihre Schleife nur 52 Mal läuft ( myDeck.size() ). Sie entfernen also eine Karte und ersetzen sie zufällig nur 52 Mal. Das scheint nicht genug zu sein.

ps: Es ist üblicher, for(int i = 0; i < max; i++) als for (int i = max; i >0 i--) zu schreiben.

    
assylias 06.08.2012 21:05
quelle
0

Ändern Sie die Schleife zu:

%Vor%

Auf diese Weise werden Sie nicht immer dieselbe Karte auswählen, und Sie wählen immer eine Nummer (Zelle) & lt; myDeck.size (), das sich ständig ändert, wenn Sie Karten entfernen, und BACK-out, wenn sich keine Karten im Deck befinden

    
alfasin 06.08.2012 21:27
quelle

Tags und Links