2017-06-20 103 views
0

我讀了函數Intn https://golang.org/pkg/math/rand/#Intn的文檔,但我不明白他們的意思 我知道隨機數與僞隨機數有什麼不同。但是,我如何模擬1到1000範圍內的隨機數?如何從範圍中選擇一個隨機數?

package main 
import (
    "fmt" 
    "math/rand" 
) 

func main() { 
    fmt.Println(randInt(1, 1000)) 
} 

func randInt(min int, max int) int { 
    return min + rand.Intn(max-min) 
} 

的答案永遠是879

func main() { 
    fmt.Print(rand.Intn(100)) 
} 

答案總是81

+1

你是否在圍棋操場上這樣做? – Adrian

回答

1

你需要 「種子」 的隨機數發生器。這就像告訴僞隨機數生成器如何生成數字的代碼一樣。現在,你不能只給這個數字,或者你每次都要生成相同的數字。通常,一個好的做法是用當前時間種子。

package main 
import (
    "fmt" 
    "math/rand" 
    "time" #ADDED 
) 

func main() { 
    // Seed should be set once, better spot is func init() 
    rand.Seed(time.Now().UTC().UnixNano()) #ADDED 
    fmt.Println(randInt(1, 1000)) 
} 

func randInt(min int, max int) int { 
    return min + rand.Intn(max-min) 
} 

現在每次你打電話給你randInt()功能時,它會使用來自當種子函數被調用,生成隨機數的時間。

+0

非常感謝,它的作品! rand.Seed函數如何取決於函數randInt?或者它在某種程度上影響了應用程序和Intn? – gomazafaka

+0

它正在修改rand對象。把它想象成一個存儲在rand中的值。默認情況下,它被設置爲1.我們只是將其更改爲當前時間。 –

0

兩點。首先,如math/rand的文檔頂部所示:

如果每次運行都需要不同的行爲,請使用Seed函數初始化默認Source。

如果沒有不同的東西每次運行(如時鐘時間)種子它,你會每次運行時得到相同的結果,因爲默認的種子始終是1

第二,如果你'在Playground上運行它,每次你都會得到相同的結果,因爲它會緩存執行結果。如果代碼相同,結果將是相同的。

+0

這是否意味着Intn需要一些內部程序結構的數據,這些結構必須在種子的幫助下設置?從文檔來看,我感到難以理解。 – gomazafaka

+0

所有PRNG的操作方式基本相同,對數字進行排列以獲得近乎隨機的結果。他們通常將先前的隨機數作爲下一個隨機數的輸入;這意味着要生成* first *隨機數,他們需要一個起點,這就是「種子」。從相同的種子開始產生相同的數字序列。 – Adrian

相關問題