Shuffle Test

last modified: June 2, 2004

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


Loading...