Rumah >pembangunan bahagian belakang >C++ >Adakah menggunakan `orderby` dengan` rawak` cara yang efisien untuk shuffle senarai?

Adakah menggunakan `orderby` dengan` rawak` cara yang efisien untuk shuffle senarai?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-31 18:51:10958semak imbas

Is Using `OrderBy` with `Random` an Efficient Way to Shuffle a List?

Apakah kecekapan menggunakan

dan untuk menyenaraikan senarai? Random OrderBy Artikel ini meneroka kecekapan menggunakan kaedah dan

untuk menyenaraikan senarai. Contoh kod adalah seperti berikut:

Random Prinsip kerja kod OrderBy

<code class="language-csharp">var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());</code>
Kod ini menggunakan

kelas untuk menjana nombor rawak. Untuk setiap elemen dalam senarai, kaedah menggunakan ekspresi lambda untuk memperuntukkan nombor rawak untuknya. Kemudian, senarai itu disusun mengikut nombor rawak ini untuk mencapai kesan shuffling.

Apakah kecekapan algoritma shuffle ini? Random ordered Walaupun kod ini dapat mencapai tujuan mengocok, kecekapannya bermasalah. OrderBy Lapisan bawah kaedah menggunakan algoritma penyortiran O (N log n), yang terlalu rumit untuk tugas perombakan, kerana perombakan hanya memerlukan kerumitan masa O (n). x => r.Next()

lebih baik dan mempertimbangkan faktor

Algoritma shuffle yang lebih berkesan adalah algoritma shuffle Fisher-Yates. Untuk kemudahan dan kejelasan, anda boleh membuat kaedah pengembangan

menggunakan algoritma Fisher-Yates.

OrderBy algoritma shuffle Fisher-Yates melalui senarai lelaran, bertukar elemen dengan unsur-unsur terpilih rawak untuk mencapai shuffling. Berikut adalah kaedah pengembangan mudah (pemeriksaan tanpa had):

Menggunakan algoritma Fisher-Yates boleh mengelakkan pengiraan overhead yang dibawa oleh sambil mengekalkan fungsi shuffling.

Atas ialah kandungan terperinci Adakah menggunakan `orderby` dengan` rawak` cara yang efisien untuk shuffle senarai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn