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?
6
A
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
Kwestia zasugerował użyciu dwóch losowych UInt32'S, z jakiegokolwiek powodu, że nie działa dla Ciebie? – evanmcdonnal
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. –
Należy to naprawić przed zakończeniem cyklu wydań 1.8 na koniec października: https://go-review.googlesource.com/c/27253/1 –