首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C# Random 類在迴圈中實例化導致產生相同隨機數的原因與解決

     編輯:程式設計綜合問答

現象

// 錯誤:放在迴圈內
for (int i = 0; i < 3; i++) {
    Random r = new Random(); // 每次新建
    int n = r.Next(1, 4);
    // 連續執行時 n 相同;逐步偵錯時因時間間隔較長,可能不同
}

原因

  • Random() 無參建構子以 Environment.TickCount(毫秒級)為種子。
  • 迴圈執行極快,多次建構在同一毫秒內,種子相同,產生相同序列。
  • 偵錯時人為延遲導致種子不同,故現象消失。

正確做法

// 正確:單一實例重複使用
Random r = new Random(); // 放在迴圈外
for (int i = 0; i < 3; i++) {
    int n = r.Next(1, 4); // 每次取下一個隨機數
}

進階:多執行緒安全

// ThreadLocal 隔離,避免競爭
ThreadLocal<Random> localRandom = ThreadLocal.withInitial(Random::new);
int n = localRandom.get().Next(1, 4);

或使用 .NET 6+ 的 Random.Shared(內建執行緒安全)。

總結

Random 實例化一次,重複呼叫 Next();切勿在高頻迴圈中反覆 new Random()。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved