menggunakan OrderBy(x => r.Next())
untuk senarai shuffling: berkesan atau tidak?
Beberapa pengaturcara menggunakan OrderBy(x => r.Next())
untuk mengosongkan senarai, tetapi adakah ini pendekatan terbaik? Mari kita periksa mekanik dan kecekapannya.
Bagaimana ia berfungsi
Kaedah ini memberikan nombor rawak kepada setiap item dalam senarai dan kemudian menyusun senarai berdasarkan nombor rawak ini. Ini berkesan mengemukakan semula senarai secara rawak.
Isu Prestasi
Kelemahan utama adalah prestasi. Kaedah OrderBy
mempunyai kerumitan masa O (n log n), menjadikannya lebih perlahan daripada algoritma o (n) yang lain untuk senarai yang lebih besar.
Penyelesaian yang lebih baik: The Fisher-Yates Shuffle
Alternatif yang jauh lebih efisien ialah Shuffle Fisher-Yates (khususnya, varian Durstenfeld), yang menggunakan algoritma swap. Contoh ini menunjukkan kaedah Shuffle
yang boleh diguna semula menggunakan pendekatan ini:
<code class="language-csharp">public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng) { T[] elements = source.ToArray(); for (int i = elements.Length - 1; i >= 0; i--) { int swapIndex = rng.Next(i + 1); yield return elements[swapIndex]; elements[swapIndex] = elements[i]; } }</code>
versi yang lebih baik ini menghasilkan unsur -unsur kerana ia mengepam, mengoptimumkan penggunaan memori dan pemprosesan.
Nota penting pada Random
ingat perkara ini ketika bekerja dengan kelas Random
:
Random
contoh berturut -turut boleh membawa kepada urutan nombor rawak yang sama. Random
bukan thread-safe. rujuk artikel yang dipautkan untuk amalan terbaik menggunakan kelas Random
untuk mengelakkan perangkap ini.
Atas ialah kandungan terperinci Adakah `OrderBy (x => r.next ())` Cara yang berkesan untuk mengosongkan senarai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!