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>
<code class="language-csharp">byte[] mac = new byte[6]; for (int x = 0; x < 6; x++) { mac[x] = (byte)RandomNumber(0, 255); }</code>
. 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>
, 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!