github.com/avahowell/sia@v0.5.1-beta.0.20160524050156-83dcc3d37c94/crypto/rand.go (about) 1 package crypto 2 3 import ( 4 "crypto/rand" 5 "math/big" 6 ) 7 8 // RandBytes returns n bytes of random data. 9 func RandBytes(n int) ([]byte, error) { 10 b := make([]byte, n) 11 _, err := rand.Read(b) 12 return b, err 13 } 14 15 // RandIntn returns a non-negative random integer in the range [0,n). It panics 16 // if n <= 0. 17 func RandIntn(n int) (int, error) { 18 r, err := rand.Int(rand.Reader, big.NewInt(int64(n))) 19 return int(r.Int64()), err 20 } 21 22 // Perm returns, as a slice of n ints, a random permutation of the integers 23 // [0,n). 24 func Perm(n int) ([]int, error) { 25 m := make([]int, n) 26 for i := 0; i < n; i++ { 27 j, err := RandIntn(i + 1) 28 if err != nil { 29 return nil, err 30 } 31 32 m[i] = m[j] 33 m[j] = i 34 } 35 return m, nil 36 }