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
Lepaskan: 2025-01-24 23:36:12
asal
569 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan