Isu Penjanaan Nombor Rawak dalam Gelung
Artikel ini menangani masalah biasa yang dihadapi apabila menggunakan Random.Next()
dalam gelung: lelaran berturut-turut menghasilkan nombor rawak yang sama. Isu ini sering menjelma apabila berbilang Random
objek diwujudkan secara berturut-turut.
Senario Masalah:
Pertimbangkan coretan kod berikut:
<code class="language-csharp">class A { Random rnd = new Random(); public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); // ... further code using r1 and r2 ... } } class B { List<A> listOfA = new List<A>(); public B() { // ... populate listOfA ... foreach (A instance in listOfA) { instance.Count(); } } }</code>
Jika listOfA
mengandungi berbilang kejadian kelas A
, setiap objek A
mencipta tika Random
sendiri. Disebabkan instantiasi berkelajuan tinggi, objek Random
ini mungkin menerima nilai benih yang sama (selalunya diperoleh daripada jam sistem), yang membawa kepada jujukan nombor rawak yang sama.
Punca Punca:
Masalahnya berpunca daripada pergantungan lalai Random
pembina pada jam sistem untuk pembenihan. Jika berbilang Random
objek dicipta dalam tempoh masa yang sangat singkat, objek tersebut menerima nilai benih yang hampir sama, menghasilkan penjanaan nombor rawak pseudo yang sama.
Penyelesaian: Contoh Rawak Tunggal
Penyelesaian adalah mudah: buat satu tika Random
dan gunakan semula pada semua tika kelas A
. Ini memastikan urutan nombor rawak yang unik dan tidak berulang dijana.
Ini kod yang diperbetulkan:
<code class="language-csharp">class A { private Random rnd; public A(Random rnd) { this.rnd = rnd; } public void Count() { int r1 = rnd.Next(-1, 1); int r2 = rnd.Next(-1, 1); // ... further code using r1 and r2 ... } } class B { Random rnd = new Random(); List<A> listOfA = new List<A>(); public B() { // ... populate listOfA, passing rnd to the constructor ... foreach (A instance in listOfA) { instance.Count(); } } }</code>
Dengan menyuntik contoh Random
tunggal (rnd
) ke dalam pembina kelas A
, kami menjamin bahawa semua panggilan ke rnd.Next()
dibuat daripada jujukan yang sama, berbenih dengan betul. Ini secara berkesan menghapuskan penjanaan nombor rawak pendua.
Atas ialah kandungan terperinci Kenapa rawak.NEXT menghasilkan nilai yang sama dalam lelaran gelung berturut -turut?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!