2017-08-18 56 views
3

我是新來golang,不知道爲什麼它打印相同數量rand.Intn(n int) int每次運行:爲什麼golang重複相同的隨機數?

package main 

import (
    "fmt" 
    "math/rand" 
) 


func main() { 
    fmt.Println(rand.Intn(10)) 
} 

的文檔說:

內置內置返回,作爲一個int,非來自默認Source的[0,n]中的負僞隨機數。如果n < = 0,它會發生恐慌。

我該如何正確地給隨機數生成種子?

回答

5

通過調用rand.Seed()函數,傳遞一個(隨機)種子(通常是當前的unix時間戳)。從math/rand包doc引述:

頂層的功能,如Float64和Int,使用默認共享源產生值的確定性序列中的每個程序運行時間。如果每次運行都需要不同的行爲,請使用Seed函數初始化默認Source。

實施例:

rand.Seed(time.Now().UnixNano()) 

如果rand.Seed()不叫,發電機的行爲如同接種按1:

種子使用所提供的種子值的缺省源初始化爲一個確定性州。如果種子沒有被調用,那麼生成器的行爲就像種子(1)播種一樣。

+0

Thanks @icza。所以默認的'種子'有些不變? –

+1

@muja是的,就好像被種子1所示。參見編輯答案。 – icza

1
package main 

import 

(
"fmt" 
"math/rand" 
"time" 
) 

func randomGen(min, max int) int { 
rand.Seed(time.Now().Unix()) 
return rand.Intn(max - min) + min 
} 

func main() { 
randNum := randomGen(1, 10) 
fmt.Println(randNum) 
}