Jacco, twoje rozwiązanie to niestandardowy IComparer nie jest bezpieczny. Procedury sortowania wymagają, aby funkcja porównująca spełniała kilka wymagań, aby działała poprawnie. Pierwsza z nich to konsekwencja. Jeśli funkcja porównująca jest wywoływana na tej samej parze obiektów, musi zawsze zwracać ten sam wynik. (porównanie musi być również przechodnie).
Niespełnienie tych wymagań może powodować wiele problemów w procedurze sortowania, w tym możliwość nieskończonej pętli.
Jeśli chodzi o rozwiązania, które kojarzą losową wartość liczbową z każdym wpisem, a następnie sortują je według tej wartości, prowadzą one do nieodłącznego odchylenia w wyniku, ponieważ za każdym razem, gdy dwóm wpisom zostanie przypisana ta sama wartość liczbowa, losowość wyniku będzie zagrożona. (W "stabilnej" procedurze sortowania, cokolwiek jest pierwsze na wejściu, będzie pierwsze w wyjściu. Array.Sort nie jest stabilne, ale nadal istnieje odchylenie oparte na partycjonowaniu wykonanym przez algorytm Quicksort).
Musisz trochę pomyśleć o tym, jakiego poziomu losowości potrzebujesz. Jeśli prowadzisz serwis pokerowy, w którym potrzebujesz kryptograficznych poziomów losowości, aby chronić się przed zdeterminowanym napastnikiem, masz bardzo inne wymagania niż ktoś, kto chce po prostu losować listę odtwarzania utworów.
W przypadku tasowania listy utworów nie ma problemu z używaniem rozstawionego PRNG (takiego jak System.Random). W przypadku strony pokerowej nie jest to nawet opcja i musisz pomyśleć o problemie dużo trudniej niż ktokolwiek ma zamiar zrobić dla ciebie w stackoverflow. (użycie kryptograficznego RNG to dopiero początek, musisz upewnić się, że twój algorytm nie wprowadza odchylenia, że masz wystarczające źródła entropii i że nie ujawniasz żadnego stanu wewnętrznego, który zagrażałby późniejszej losowości).