import java.util.Random; public class ShuffleTest { private static final int NUM_ITERATIONS = 10000000; private static final int DECK_SIZE = 52; public static void main(String[] args) { // // Create the deck // int[] deck = new int[DECK_SIZE]; for (int i = 0; i < deck.length; i++) { deck[i] = i; } // // Count the number of matches for various shuffles. // Random random = new Random(System.currentTimeMillis()); int badShuffleMatchCount = 0; int goodShuffleMatchCount = 0; int evenBetterShuffleMatchCount = 0; for (int i = 0; i < NUM_ITERATIONS; i++) { // // Bad shuffle // int[] deckCopy = copyDeck(deck); for (int j = 0; j < 100; j++) { int randomIndex1 = random.nextInt(deck.length); int randomIndex2 = random.nextInt(deck.length); int tmp = deck[randomIndex1]; deck[randomIndex1] = deck[randomIndex2]; deck[randomIndex2] = tmp; } badShuffleMatchCount += countMatches(deckCopy, deck); // // Good shuffle // deckCopy = copyDeck(deck); for (int j = 0; j < deck.length; j++) { int randomIndex = random.nextInt(deck.length); int tmp = deck[j]; deck[j] = deck[randomIndex]; deck[randomIndex] = tmp; } goodShuffleMatchCount += countMatches(deckCopy, deck); // // Even better shuffle // deckCopy = copyDeck(deck); for (int j = 0; j < deck.length; j++) { int randomIndex = j + random.nextInt(deck.length - j); int tmp = deck[j]; deck[j] = deck[randomIndex]; deck[randomIndex] = tmp; } evenBetterShuffleMatchCount += countMatches(deckCopy, deck); } System.out.println("Bad shuffle # matches: " + badShuffleMatchCount + " (" + (badShuffleMatchCount / (double)NUM_ITERATIONS) + " per shuffle)"); System.out.println("Good shuffle # matches: " + goodShuffleMatchCount + " (" + (goodShuffleMatchCount / (double)NUM_ITERATIONS) + " per shuffle)"); System.out.println("Even better shuffle # matches: " + evenBetterShuffleMatchCount + " (" + (evenBetterShuffleMatchCount / (double)NUM_ITERATIONS) + " per shuffle)"); } // main private static int[] copyDeck(int[] deck) { int[] deckCopy = new int[deck.length]; for (int i = 0; i < deckCopy.length; i++) { deckCopy[i] = deck[i]; } return deckCopy; } // copyDeck private static int countMatches(int[] deck1, int[] deck2) { int numMatches = 0; for (int i = 0; i < deck1.length; i++) { if (deck1[i] == deck2[i]) { numMatches++; } } return numMatches; } // countMatches } // ShuffleTest? Kevin Regan (kregan@amazon.com), 1 June 2004