Rumah >pembangunan bahagian belakang >C++ >Adakah `OrderBy (x => r.next ())` Cara pintar untuk mengosongkan senarai?
<.> r.next ()) `Cara SART untuk mengocok senarai?
" /> <code class=" language-csharp>var r = new Random();
var shuffled = ordered.OrderBy(x => r.Next());
<p> Kaedah ini bukan kaedah shuffle yang ideal. Walaupun ia menghasilkan satu -satunya nombor rawak untuk setiap elemen, ia adalah operasi O (n log n), dan terdapat algoritma O (n) yang lebih berkesan. <strong>
</strong> Prinsip kerja </p> <p>
</p> Pada dasarnya, kaedah ini diedarkan kepada unsur -unsur secara rawak dan menyusunnya berdasarkan nombor ini. Ini memastikan bahawa setiap elemen muncul dalam kedudukan yang berbeza, tetapi lokasi sebenarnya ditentukan oleh nombor rawak yang dihasilkan. <p>
<strong> kaedah alternatif </strong> </p>
<p> Adalah disyorkan untuk menggunakan algoritma shuffle Fisher-Yates versi Durstenfeld, yang secara langsung bertukar elemen. Boleh dilaksanakan menggunakan sambungan seperti ini: </p>
<p>
<strong> Pengoptimuman Prestasi </strong> </p>
<p> Untuk terus mengoptimumkan prestasi, unsur -unsur boleh dikembalikan dengan segera apabila mengalir, dengan itu mengurangkan kerja yang tidak perlu: (Kod ini sama seperti kod sebelumnya, diulang) </p>
<pre class="brush:php;toolbar:false"><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>
Penerangan penting
mesti menggunakan contoh rawak yang betul untuk mengelakkan menjana urutan digital yang sama beberapa kali dan menyimpan keselamatan benang.Atas ialah kandungan terperinci Adakah `OrderBy (x => r.next ())` Cara pintar untuk mengosongkan senarai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!