理解 Go 的 rand.Intn
Go 標準庫提供了用於產生隨機數的 rand 套件。但是,rand.Intn(n) 函數在重複呼叫時始終會傳回相同的值。這種行為提出了為什麼會發生的問題。答案在於兩個關鍵因素。
未初始化的全域來源
預設情況下,rand 套件使用產生確定性值序列的全域來源。這意味著像 rand.Intn() 這樣的函數的輸出保持不變,除非這個 Source 用種子初始化。
要解決這個問題,必須使用 rand.Seed() 設定一個隨機種子。一個常見的方法是使用從time.Now().UnixNano() 獲得的時間戳作為種子:
rand.Seed(time.Now().UnixNano())
這會初始化Source 並將隨機性引入到rand.Intn() 產生的序列中。
Go Playground 快取
導致觀察到的行為的另一個因素是去遊樂場。此線上工具會快取程式碼片段的輸出,這可能會導致相同的隨機數序列始終顯示,而不管實際的隨機性如何。
為避免此快取問題,建議在本機上執行程式碼。這確保了在執行時產生隨機種子,從而產生唯一的值序列。
透過初始化全域 Source 並避免 Go Playground 緩存,可以確保 rand.Intn() 產生真正的隨機數Go 程式中的數字。
以上是為什麼 Go 的 rand.Intn() 會重複回傳相同的數字?的詳細內容。更多資訊請關注PHP中文網其他相關文章!