[vassalengine-svn] SF.net SVN: vassalengine:[9160] VASSAL-src/trunk/src/VASSAL/counters/Deck. java
Brought to you by:
rodneykinney,
uckelman
From: <uck...@us...> - 2014-09-12 20:30:27
|
Revision: 9160 http://sourceforge.net/p/vassalengine/svn/9160 Author: uckelman Date: 2014-09-12 20:30:19 +0000 (Fri, 12 Sep 2014) Log Message: ----------- Do a proper Fisher-Yeats shuffle. Modified Paths: -------------- VASSAL-src/trunk/src/VASSAL/counters/Deck.java Modified: VASSAL-src/trunk/src/VASSAL/counters/Deck.java =================================================================== --- VASSAL-src/trunk/src/VASSAL/counters/Deck.java 2014-09-12 20:30:01 UTC (rev 9159) +++ VASSAL-src/trunk/src/VASSAL/counters/Deck.java 2014-09-12 20:30:19 UTC (rev 9160) @@ -39,6 +39,7 @@ import java.util.Collections; import java.util.Iterator; import java.util.List; +import java.util.Random; import javax.swing.Action; import javax.swing.Box; @@ -749,21 +750,23 @@ /** Shuffle the contents of the Deck */ public Command shuffle() { - final ArrayList<Integer> indices = new ArrayList<Integer>(); - for (int i = 0; i < getPieceCount(); ++i) { - indices.add(i); - } - final ArrayList<GamePiece> newContents = new ArrayList<GamePiece>(); DragBuffer.getBuffer().clear(); + + final int n = getPieceCount(); + + final ArrayList<GamePiece> dst = new ArrayList<GamePiece>( + Collections.nCopies(n, (GamePiece) null) + ); + final Random rng = GameModule.getGameModule().getRNG(); -// FIXME: check whether this is a good shuffle - for (int count = getPieceCount(); count > 0; --count) { - final int i = rng.nextInt(indices.size()); - int index = indices.get(i); - indices.remove(i); - newContents.add(getPieceAt(index)); + + for (int i = 0; i < n; ++i) { + final int j = rng.nextInt(i+1); + dst.set(i, dst.get(j)); + dst.set(j, getPieceAt(i)); } - return setContents(newContents).append(reportCommand(shuffleMsgFormat, Resources.getString("Deck.shuffle"))); //$NON-NLS-1$ + + return setContents(dst).append(reportCommand(shuffleMsgFormat, Resources.getString("Deck.shuffle"))); //$NON-NLS-1$ } /** This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |