Go's math/random
library is missing a function to generate 64-bit numbers. This has been an open issue for about four years. In the meantime, what does a workaround look like?

- 30,334
- 10
- 78
- 137
-
2That issue suggested using two random uint32's, any reason that doesn't work for you? – evanmcdonnal Sep 28 '16 at 19:41
-
3you can shift-OR two int32 numbers, or something similar. You can also use the crypto/rand package and copy a byte buffer to a uint64. – Not_a_Golfer Sep 28 '16 at 19:42
-
1This should be fixed before the 1.8 release cycle is over at the end of October: https://go-review.googlesource.com/c/27253/1 – Sam Whited Sep 30 '16 at 15:56
3 Answers
Edit: Go 1.8 added a rand.Uint64()
function and a Rand.Uint64()
method, so you can directly use those.
The rest of the answer pre-dates Go 1.8.
The easiest would be to call rand.Uint32()
twice:
func Uint64() uint64 {
return uint64(rand.Uint32())<<32 + uint64(rand.Uint32())
}
Another option is to call rand.Read()
(was added in Go 1.7) to read 8 bytes, then use the encoding/binary
package to obtain a uint64
value from it:
func Uint64() uint64 {
buf := make([]byte, 8)
rand.Read(buf) // Always succeeds, no need to check error
return binary.LittleEndian.Uint64(buf)
}
Note: as the doc of rand.Read()
states, it always reads as many bytes as the length of the passed slice, and it always returns nil
error, so no need to check error in this case.
Note #2: you could also use binary.BigEndian
instead of binary.LittleEndian
, as we're generating a random number using all its bytes, order of bytes is completely irrelevant.

- 389,944
- 63
- 907
- 827
You can also read 8 random bytes, and convert to a uint64
b := make([]byte, 8)
_, err := rand.Read(b)
return binary.LittleEndian.Uint64(b), err

- 104,193
- 13
- 262
- 255
You can call rand.Uint64()
directly:
r := rand.Uint64()
Uint64 returns a pseudo-random 64-bit value as a uint64 from the default Source.
https://golang.org/pkg/math/rand/#Uint64
This is available in versions 1.8
and up: changelog

- 674
- 7
- 21
-
1Note that this would not be cryptographically secure and therefore not suitable for many applications. – PassKit Dec 20 '18 at 12:35