Жакко, ваше рішення - це нестандартний IComparer. Програми сортування вимагають, щоб порівняльник відповідав декільком вимогам, щоб нормально функціонувати. Перше серед них - консистенція. Якщо порівняльник викликається однією і тією ж парою об'єктів, він повинен завжди повертати один і той же результат. (порівняння також має бути транзитивним).
Невиконання цих вимог може спричинити будь-яку кількість проблем в режимі сортування, включаючи можливість нескінченного циклу.
Що стосується рішень, які пов'язують випадкове числове значення з кожним записом, а потім сортують за цим значенням, вони призводять до притаманного зміщення виводу, оскільки будь-коли двом записам присвоюється однакове числове значення, випадковість виводу буде порушена. (У "стабільному" режимі сортування, що б не було першим у вході, буде першим у висновку. Array.Sort не буває стабільним, але все ще існує зміщення, засноване на розподілі, виконаному алгоритмом Quicksort).
Вам потрібно задуматися над тим, який рівень випадковості вам потрібен. Якщо ви користуєтеся покерним сайтом, де вам потрібні криптографічні рівні випадковості для захисту від визначеного зловмисника, у вас є дуже різні вимоги до тих, хто просто хоче рандомізувати список відтворення пісень.
Для перетасування списків пісень немає жодної проблеми з використанням насінного PRNG (наприклад, System.Random). Для покерного сайту це навіть не варіант, і вам потрібно думати про проблему набагато складніше, ніж хтось збирається зробити для вас під час stackoverflow. (використання криптографічного RNG - це лише початок. Вам потрібно переконатися, що ваш алгоритм не вводить упередженість, у вас є достатні джерела ентропії, і що ви не піддаєте жодного внутрішнього стану, який би загрожував подальшій випадковості).