在Go中生成随机的固定长度字节数组

时间:2016-03-03 19:24:25

标签: arrays go random slice

我有一个字节数组,固定长度为4。

token := make([]byte, 4)

我需要将每个字节设置为一个随机字节。我怎么能这样做,在最有效的事情?就我而言,math/rand方法不提供随机字节功能。

也许有一种内置方式,或者我应该生成随机字符串并将其转换为字节数组?

2 个答案:

答案 0 :(得分:20)

  

Package rand

import "math/rand" 
     

func Read

func Read(p []byte) (n int, err error)
     

Read从默认Source生成len(p)个随机字节并写入   他们进入p。它总是返回len(p)和nil错误。

     

˚Func (*Rand) Read

func (r *Rand) Read(p []byte) (n int, err error)
     

读取生成len(p)个随机字节并将它们写入p。它永远   返回len(p)和nil错误。

例如,

package main

import (
    "math/rand"
    "fmt"
)

func main() {
    token := make([]byte, 4)
    rand.Read(token)
    fmt.Println(token)
}

输出:

[187 163 35 30]

答案 1 :(得分:10)

Go 1.6为math/rand包添加了一个新功能:

func Read(p []byte) (n int, err error)

用随机数据填充传递的byte切片。使用此rand.Read()

token := make([]byte, 4)
if _, err := rand.Read(token); err != nil {
    // Handle err
}
fmt.Println(token)

rand.Read()有2个返回值:“读”字节数和(可选)error。这是为了符合一般的io.Reader接口,但是rand.Read()的文档声明(尽管它有签名)它实际上永远不会返回非nil错误,所以我们可能省略检查它,简化了它:

token := make([]byte, 4)
rand.Read(token){
fmt.Println(token)

在使用math/rand软件包之前,请不要忘记致电rand.Seed()以正确初始化它,例如:

rand.Seed(time.Now().UnixNano())

注意:在Go 1.6之前没有math/rand.Read()函数,但是(并且仍然是)crypto/rand.Read()函数,但crypto/rand包实现了加密安全的伪随机数生成器,所以它比math/rand慢得多。