Jacco, Ihre Lösung für einen benutzerdefinierten IComparer ist nicht sicher. Die Sortierroutinen erfordern, dass der Vergleicher mehrere Anforderungen erfüllt, um ordnungsgemäß zu funktionieren. An erster Stelle steht dabei die Konsistenz. Wenn der Vergleicher für dasselbe Objektpaar aufgerufen wird, muss er immer dasselbe Ergebnis zurückgeben. (Der Vergleich muss auch transitiv sein).
Die Nichterfüllung dieser Anforderungen kann zu einer Reihe von Problemen in der Sortierroutine führen, einschließlich der Möglichkeit einer Endlosschleife.
In Bezug auf die Lösungen, die jedem Eintrag einen zufälligen numerischen Wert zuordnen und dann nach diesem Wert sortieren, führen diese zu einer inhärenten Verzerrung in der Ausgabe, da jedes Mal, wenn zwei Einträgen der gleiche numerische Wert zugewiesen wird, die Zufälligkeit der Ausgabe beeinträchtigt wird. (In einer "stabilen" Sortierroutine ist das, was zuerst in der Eingabe steht, das erste in der Ausgabe. Array.Sort ist zwar nicht stabil, aber es gibt immer noch eine Verzerrung, die auf der vom Quicksort-Algorithmus vorgenommenen Partitionierung basiert.)
Sie müssen sich überlegen, welchen Grad an Zufälligkeit Sie benötigen. Wenn Sie eine Pokerseite betreiben, auf der Sie kryptografische Zufallsstufen benötigen, um sich vor einem entschlossenen Angreifer zu schützen, haben Sie ganz andere Anforderungen als jemand, der nur eine Song-Wiedergabeliste zufällig auswählen möchte.
Für das Mischen von Songlisten gibt es kein Problem mit einem gesetzten PRNG (wie System.Random). Für eine Pokerseite ist dies nicht einmal eine Option und Sie müssen viel schwieriger über das Problem nachdenken, als irgendjemand bei einem Stackoverflow für Sie tun wird. (Die Verwendung eines kryptografischen RNG ist nur der Anfang. Sie müssen sicherstellen, dass Ihr Algorithmus keine Verzerrung einführt, dass Sie über ausreichende Entropiequellen verfügen und dass Sie keinen internen Zustand offenlegen, der die nachfolgende Zufälligkeit beeinträchtigen würde.)