I ran a series of tests on 52-card decks, using different shuffling algorithms. The results are shown in the manner described by Mike Bostock at "Will It Shuffle?".
The matrix diagrams are a 2-dimensional display of the number of times a particular card shows up in a particular spot, after the shuffle is complete. The x-axis is labeled with the card that initially occupies each cell. For example, "1c" (Ace of Clubs), is in the first position. If the Ace of Clubs does not move during the shuffle, then the upper left cell's count is incremented by 1. If the Ace of Clubs is moved to the very last position during a shuffle, then the lower left cell's count is incremented by 1.
If the shuffle is good, then cards will tend to get moved around from their initial position to some other position with equal probability, so you should see no particular pattern to the shuffled card matrix. Non-random shuffles will exhibit patterns in the grid because cards don't get distributed randomly. Green indicates a card that shows up a lot in that position, red means it shows up less.
In the examples below, the matrices are shown. For the bad shuffles, a sample of the resulting deck of cards is also displayed. In the cases where the matrices are smooth and the shuffle is good, a sample deck is not shown. In those cases, each one differs widely, and there's no representative sample deck.
At World of Card Games, the deck is shuffled using the Fisher-Yates shuffle. Shuffled decks for the game of Hearts were logged over the course of several days. The last two matrix diagrams are graphs of the results from two of those days. They are both pretty smooth and look nicely random, with no recognizable pattern.
Table.prototype.shuffle = function(a) {
var m = a.length, t, i;
while(m) {
i = 0; // i is not random at all!
--m;
t = a[m];
a[m] = a[i];
a[i] = t;
}
return a;
};
Table.prototype.shuffle = function(a) {
var m = a.length, t, i;
while(m) {
i = this.randomInt(0, 2);
--m;
t = a[m];
a[m] = a[i];
a[i] = t;
}
return a;
};
Table.prototype.shuffle = function(a) {
var m = a.length, t, i;
while(m) {
i = this.randomInt(0, 5);
--m;
t = a[m];
a[m] = a[i];
a[i] = t;
}
return a;
};
Table.prototype.shuffle = function(a) {
var m = a.length, t, i;
while(m) {
i = this.randomInt(0, 50);
--m;
t = a[m];
a[m] = a[i];
a[i] = t;
}
return a;
};
Table.prototype.shuffle = function(a) {
var m = a.length, t, i;
while(m) {
i = this.randomInt(0, --m);
t = a[m];
a[m] = a[i];
a[i] = t;
}
return a;
};