Implementation of the Fisher Yates shuffle, that guarantees that all n! possible outcomes are possible and equally likely. The shuffling procedure requires only linear runtime. However, the implementation is quite slow because the original DataRows need to be assigned to the shuffled rowkeys. For further details see "Fisher-Yates shuffle", from Dictionary of Algorithms and Data Structures, Paul E. Black, ed., NIST.