Rumah >pembangunan bahagian belakang >C++ >Kenapa rawak.NEXT menghasilkan nilai yang sama dalam lelaran gelung berturut -turut?

Kenapa rawak.NEXT menghasilkan nilai yang sama dalam lelaran gelung berturut -turut?

Mary-Kate Olsen
Mary-Kate Olsenasal
2025-01-24 23:36:12575semak imbas

Why Does Random.Next Produce Identical Values in Consecutive Loop Iterations?

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!

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