Jacco, ваше решение для нестандартного IComparer небезопасно. Процедуры сортировки требуют, чтобы компаратор соответствовал нескольким требованиям для правильной работы. Первым среди них является последовательность. Если компаратор вызывается для одной и той же пары объектов, он всегда должен возвращать один и тот же результат. (сравнение также должно быть транзитивным).
Невыполнение этих требований может привести к ряду проблем в процедуре сортировки, включая возможность бесконечного цикла.
Что касается решений, которые связывают случайное числовое значение с каждой записью, а затем сортируют по этому значению, это приводит к внутреннему смещению в выходных данных, поскольку каждый раз, когда двум записям присваивается одно и то же числовое значение, случайность выходных данных будет быть скомпрометированным. (В «стабильной» процедуре сортировки, какой бы ни был первый на входе, он будет первым на выходе. Array.Sort не является стабильным, но все еще существует смещение, основанное на разделении, выполненном алгоритмом быстрой сортировки).
Вам нужно подумать о том, какой уровень случайности вам требуется. Если вы используете покерный сайт, где вам нужны криптографические уровни случайности для защиты от решительного злоумышленника, у вас очень разные требования к тому, кто просто хочет рандомизировать список воспроизведения песни.
Для перетасовки списка песен нет проблем с использованием засеянного PRNG (например, System.Random). Для покерного сайта это даже не вариант, и вам нужно думать о проблеме намного сложнее, чем кто-либо собирается сделать для вас в stackoverflow. (использование криптографического ГСЧ - это только начало, вам нужно убедиться, что ваш алгоритм не вносит смещения, что у вас достаточно источников энтропии и что вы не выставляете какое-либо внутреннее состояние, которое может поставить под угрозу последующую случайность).