Go has two packages for random numbers:
-
crypto/rand
, which provides a way to get random bytes -
math/rand
, which has a nice algorithm for shuffling ints
I want to use the Perm
algorithm from math/rand
, but provide it with high-quality random numbers.
Since the two rand
packages are part of the same standard library there should be a way to combine them in a way so that crypto/rand
provides a good source of random numbers that is used by math/rand.Perm
to generate a permutation.
Here (and on the Playground) is the code I wrote to connect these two packages:
package main
import (
cryptoRand "crypto/rand"
"encoding/binary"
"fmt"
mathRand "math/rand"
)
type cryptoSource struct{}
func (s cryptoSource) Int63() int64 {
bytes := make([]byte, 8, 8)
cryptoRand.Read(bytes)
return int64(binary.BigEndian.Uint64(bytes) >> 1)
}
func (s cryptoSource) Seed(seed int64) {
panic("seed")
}
func main() {
rnd := mathRand.New(&cryptoSource{})
perm := rnd.Perm(52)
fmt.Println(perm)
}
This code works. Ideally I don't want to define the cryptoSource
type myself but just stick together the two rand
packages so that they work together. So is there a predefined version of this cryptoSource
type somewhere?