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  }