2016-09-28 4 views
6

Goのmath/randomライブラリには64ビットの数値を生成する関数がありません。これは約4年間an open issueでした。その間、回避策はどのように見えますか?Goでランダムなuint64をどのように生成しますか?

+2

に変換することができますか? – evanmcdonnal

+3

あなたは2つのint32番号、または類似のものをshift-ORすることができます。また、crypto/randパッケージを使用して、バイトバッファをuint64にコピーすることもできます。 –

+1

これは、1.8リリースサイクルが10月末に終了する前に修正する必要があります。https://go-review.googlesource.com/c/27253/1 –

答えて

9

最も簡単には二回rand.Uint32()を呼び出すために、次のようになります。

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

別のオプションは、それからuint64値を取得するためにencoding/binaryパッケージを使用し、rand.Read()was added in Go 1.7)は8つのバイトを読み取るために呼び出すことです

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この場合にはちょっとしたエラーです。

注2:binary.LittleEndianの代わりにbinary.BigEndianを使用することもできます。すべてのバイトを使用して乱数を生成するため、バイトの順序は完全には関係ありません。

4

また、ランダムな8つのバイトを読んで、その問題が、あなたのために動作しません何らかの理由は2つのランダムUINT32年代を使うことを提案uint64型

b := make([]byte, 8) 
_, err := rand.Read(b) 
return binary.LittleEndian.Uint64(b), err 
関連する問題