Rumah > pembangunan bahagian belakang > C++ > Mengapa Penjana Rentetan Rawak Saya Menghasilkan Rentetan Yang Sama, dan Bagaimana Saya Boleh Membetulkannya?

Mengapa Penjana Rentetan Rawak Saya Menghasilkan Rentetan Yang Sama, dan Bagaimana Saya Boleh Membetulkannya?

Barbara Streisand
Lepaskan: 2025-01-05 16:45:44
asal
566 orang telah melayarinya

Why Does My Random String Generator Produce Identical Strings, and How Can I Fix It?

Isu Konsistensi Penjana Rentetan Rawak

Pernyataan Masalah:

Penjana rentetan rawak sedang mempamerkan tingkah laku yang tidak dijangka, menghasilkan rentetan empat aksara yang sama apabila berbilang seruan. Fungsi yang diingini adalah untuk menjana dua rentetan rawak yang berbeza.

Coretan Kod:

private string RandomString(int size)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;
    for (int i = 0; i < size; i++)
    {
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));                 
        builder.Append(ch);
    }

    return builder.ToString();
}
Salin selepas log masuk

Resolusi:

The ketidakkonsistenan timbul daripada mencipta contoh baharu kelas Rawak dalam kaedah RandomString. Ini menyebabkan nilai benih yang sama digunakan untuk setiap seruan, menghasilkan urutan yang sama.

Penyelesaian:

Untuk memastikan rawak sebenar, alihkan instantiasi kelas Rawak ke medan statik:

private static Random random = new Random((int)DateTime.Now.Ticks);
Salin selepas log masuk

Ini memastikan bahawa satu contoh penjana nombor rawak digunakan sepanjang sepanjang hayat program. Nilai DateTime.Now.Ticks berfungsi sebagai benih unik, menjamin bahawa setiap panggilan berikutnya ke RandomString menghasilkan rentetan rawak yang unik.

Kod Diubah Suai:

private static Random random = new Random((int)DateTime.Now.Ticks);
private string RandomString(int size)
{
    StringBuilder builder = new StringBuilder();
    char ch;
    for (int i = 0; i < size; i++)
    {
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));                 
        builder.Append(ch);
    }

    return builder.ToString();
}
Salin selepas log masuk

Dengan melaksanakan perubahan ini, penjana kini akan menghasilkan dua rawak yang berbeza rentetan:

// get 1st random string 
string Rand1 = RandomString(4);

// get 2nd random string 
string Rand2 = RandomString(4);

// creat full rand string
string docNum = Rand1 + "-" + Rand2;
Salin selepas log masuk

Output:

UNTE-FWNU
Salin selepas log masuk

Atas ialah kandungan terperinci Mengapa Penjana Rentetan Rawak Saya Menghasilkan Rentetan Yang Sama, dan Bagaimana Saya Boleh Membetulkannya?. 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