2016-09-28 65 views
6

Go的math/random庫缺少一個函數來生成64位數字。這已經是an open issue約四年。與此同時,解決方法是什麼樣的?如何在Go中生成隨機uint64?

+2

使用兩個隨機UINT32的建議問題,任何理由不爲你工作? – evanmcdonnal

+3

你可以移位 - 或兩個int32數字,或類似的東西。您也可以使用crypto/rand軟件包並將字節緩衝區複製到uint64。 –

+1

在10月底的1.8發佈週期結束之前,應該修復此問題:https://go-goview.googlesource.com/c/27253/1 –

回答

9

,最簡單的是調用rand.Uint32()兩次:

func Uint64() uint64 { 
    return uint64(rand.Uint32())<<32 + uint64(rand.Uint32()) 
} 

另一種選擇是調用rand.Read()was added in Go 1.7)讀取8個字節,然後使用encoding/binary包以獲得從它uint64值:

func Uint64() uint64 { 
    buf := make([]byte, 8) 
    rand.Read(buf) // Always succeeds, no need to check error 
    return binary.LittleEndian.Uint64(buf) 
} 

注意:正如文檔rand.Read()所指出的那樣,它總是讀取與傳遞片段的長度一樣多的字節,並且總是返回nil錯誤,所以不需要c heck錯誤在這種情況下。

注意#2:您也可以使用binary.BigEndian而不是binary.LittleEndian,因爲我們使用它的所有字節生成一個隨機數,字節順序是完全不相關的。

4

您還可以閱讀8個隨機字節,並轉換成UINT64

b := make([]byte, 8) 
_, err := rand.Read(b) 
return binary.LittleEndian.Uint64(b), err