2016-09-28 4 views
6

В библиотеке Go math/random отсутствует функция для генерации 64-разрядных номеров. Это было an open issue около четырех лет. В то же время, как выглядит обходное решение?Как вы генерируете случайный uint64 в Go?

+2

Этот вопрос предложил использовать два случайных uint32, любой причине, что не работает для вас? – evanmcdonnal

+3

вы можете сдвинуть-ИЛИ два int32 числа или что-то подобное. Вы также можете использовать пакет crypto/rand и скопировать байт-буфер в uint64. –

+1

Это должно быть исправлено до окончания цикла выпуска 1.8 в конце октября: https://go-review.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 error в этом случае.

Примечание № 2: вы также можете использовать binary.BigEndian вместо binary.LittleEndian, так как мы генерируем случайное число, используя все его байты, порядок байтов совершенно не имеет значения.

4

Вы также можете прочитать 8 случайных байт и преобразовать в uint64

b := make([]byte, 8) 
_, err := rand.Read(b) 
return binary.LittleEndian.Uint64(b), err 
Смежные вопросы