Rumah > pembangunan bahagian belakang > C++ > Mengapa panggilan berulang kepada `random.next ()` dalam gelung yang ketat menghasilkan nombor yang sama?

Mengapa panggilan berulang kepada `random.next ()` dalam gelung yang ketat menghasilkan nombor yang sama?

Mary-Kate Olsen
Lepaskan: 2025-02-03 08:26:42
asal
417 orang telah melayarinya

Why Do Repeated Calls to `Random.Next()` in a Tight Loop Produce Identical Numbers?

Menjana nombor rawak dengan cekap dalam gelung

coretan kod berikut menunjukkan perangkap yang sama apabila menghasilkan nombor rawak dalam gelung:

<code class="language-csharp">// Inefficient random number generation
public static int RandomNumber(int min, int max)
{
    Random random = new Random();
    return random.Next(min, max);
}</code>
Salin selepas log masuk
memanggil fungsi ini berulang kali dalam gelung yang ketat, contohnya:

<code class="language-csharp">byte[] mac = new byte[6];
for (int x = 0; x < 6; x++)
{
    mac[x] = (byte)RandomNumber(0, 255);
}</code>
Salin selepas log masuk
sering akan menghasilkan nilai yang sama dalam array

. Ini kerana mac dimulakan semula dengan jam sistem dalam setiap lelaran. Jika gelung dijalankan dengan cepat, jam tidak berubah dengan ketara, menghasilkan benih yang sama dan dengan itu urutan nombor "rawak" yang sama. Random

Penyelesaian: Satu contoh yang dikongsi bersama

Pendekatan yang betul melibatkan membuat satu

contoh dan menggunakannya semula sepanjang gelung. Keselamatan benang juga harus dipertimbangkan untuk aplikasi berbilang threaded. Inilah versi yang lebih baik: Random

<code class="language-csharp">// Efficient and thread-safe random number generation
private static readonly Random random = new Random();
private static readonly object syncLock = new object();

public static int RandomNumber(int min, int max)
{
    lock (syncLock)
    {
        return random.Next(min, max);
    }
}</code>
Salin selepas log masuk
Dengan menggunakan contoh

, kami memastikan hanya satu objek static readonly yang dibuat. Pernyataan Random melindungi terhadap keadaan kaum dalam senario pelbagai threaded, menjamin bahawa hanya satu benang mengakses kaedah lock pada satu masa. Ini mengekalkan integriti dan rawak nombor yang dihasilkan. random.Next()

Atas ialah kandungan terperinci Mengapa panggilan berulang kepada `random.next ()` dalam gelung yang ketat menghasilkan nombor yang sama?. 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