Definition:
Randomly permute N elements by exchanging each element e_{i} with a random element from i to N. It consumes Θ(N log N) bits and runs in linear time.

Note:
The algorithm can be viewed as a reverse selection sort. It is described in some detail as algorithm 3.4.2P in [Knuth97, 2:145].

For even a rather small number of elements (or cards), the total number of permutations is far larger than the period of most pseudo-random number generators. This implies that most permutations will never be generated. (After documentation for random.shuffle() in Python, particularly v2.6.1.)

Fisher-Yates shuffle illustrated with argument for correctness and error of naive shuffle.

R. A. Fisher and F. Yates, Example 12, Statistical Tables, London, 1938. Richard Durstenfeld, Algorithm 235: Random permutation, CACM 7(7):420, July 1964.