2016-09-28 16 views
6

Go w bibliotece math/random brakuje funkcji generowania liczb 64-bitowych. To było an open issue przez około cztery lata. W międzyczasie, jak wygląda obejście?Jak wygenerować losowy Uint64 w Go?

+2

Kwestia zasugerował użyciu dwóch losowych UInt32'S, z jakiegokolwiek powodu, że nie działa dla Ciebie? – evanmcdonnal

+3

możesz przesunąć-LUB dwa numery int32 lub coś podobnego. Możesz także użyć pakietu crypto/rand i skopiować bufor bajtowy do urządzenia uint64. –

+1

Należy to naprawić przed zakończeniem cyklu wydań 1.8 na koniec października: https://go-review.googlesource.com/c/27253/1 –

Odpowiedz

9

Najłatwiej byłoby nazwać rand.Uint32() dwukrotnie:

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

Innym rozwiązaniem jest wywołanie rand.Read() (was added in Go 1.7) do odczytu 8 bajtów, a następnie użyć pakietu encoding/binary do uzyskania uint64 wartość od niego:

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

Uwaga: jako dokument o numerze stwierdza, że ​​zawsze odczytuje tyle bajtów co długość przesłanego plasterka i zawsze zwraca błąd nil, więc nie ma potrzeby stosowania c w tym przypadku błąd.

Uwaga # 2: można również użyć binary.BigEndian zamiast binary.LittleEndian, ponieważ generujemy losową liczbę przy użyciu wszystkich jej bajtów, kolejność bajtów jest zupełnie nieistotna.

4

Można również przeczytać losowe 8 bajtów i konwertować do uint64

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