So is this the limit? Is it possible to get 10 million down to 20 seconds?
Thomas, can you provide an official test that verifies there are no duplicates to apply to all candidates?
I've already addressed the XOR issue. If you were swapping three local variables it might be faster, but those array accesses are more expensive than the otheractivities, I think.
This implementation traverses the list backwards, from the last element up to the second, repeatedly swapping a randomly selected element into the "current position". Elements are randomly selected from the portion of the list that runs from the first element to the current position, inclusive.