2014-09-21 67 views
0

我有點困惑。我有一個隨機字符串生成器,下面的代碼:爲什麼每次重新啓動程序時,math/rand都返回相同的結果?

package utils 

import (
    "fmt" 
    "math/rand" 
) 

var chars = []rune("abcdefghijklmnopqrstuvwxyz") 

func RandSeq(n int) string { 
    b := make([]rune, n) 
    for i := range b { 
    b[i] = chars[rand.Intn(len(chars))] 
    } 
    fmt.Println(string(b)) 
    return string(b) 
} 

我每次運行它,它會生成一個新的隨機字符串,但如果我重新啓動服務器的結果會重複自己。以下是一些結果:

go run main.go 
fpllngzieyoh43e0133ols6k1hh2gdny 
xxvi7hvszwk1b182tvjzjpezi4hx9gvm 
kir0xcta0opsb5qipjzb3h3x9kcegta5 
m1zcv5drxckn42gb50anxndsckjdwgfw 
5japz01zicapy9eqixuc9uehq235v48c 
51wgg1gypq4s9miwn1dxkjqd614m58f0 
fyy29g6ujmxbouxshy2plmkmhlnmdbfh 
f7kq8u26873eql4yyp7fyilbb72nrtlc 

go run main.go 
fpllngzieyoh43e0133ols6k1hh2gdny 
xxvi7hvszwk1b182tvjzjpezi4hx9gvm 
kir0xcta0opsb5qipjzb3h3x9kcegta5 
m1zcv5drxckn42gb50anxndsckjdwgfw 
5japz01zicapy9eqixuc9uehq235v48c 

任何想法爲什麼會發生這種情況?

回答

7

您需要的隨機數發生器產生Seed任何隨機數之前。使用的理想值是當前UNIX時間戳:

import (
    "math/rand" 
    "time" 
) 

func main() { 
    rand.Seed(time.Now().UnixNano()) 
} 

請注意,您應該只在啓動時播種RNG一次(或分叉後),而不是每個隨機數生成之前。

+0

我明白了。由於它不在主包中,因此我將它放在'init'函數中。 – daryl 2014-09-21 16:43:29

2

如果rand.Seed沒有設置,它默認種子爲1,每次給你相同的隨機數。

播種rand在啓動時使用像rand.Seed(time.Now().UnixNano())這樣的隨機數字,每次運行程序時都會給你一個變化的結果。

您也可以創建自己的隨機變種,如:

var random = rand.New(rand.NewSource(time.Now().UnixNano())) 

func main() { 
    num := random.Intn(10) 
    fmt.Println(num) 
    num = random.Intn(10) 
    fmt.Println(num) 
} 
相關問題