如何在golang中获取随机数的样本?

时间:2018-05-10 13:39:18

标签: go random slice sample

或者我必须使用直截了当的方式:

var arr []int

for i := 0; i < 5; i++ {
    arr = append(arr, rand.Intn(100))
}

1 个答案:

答案 0 :(得分:6)

你做的很干净,也很快。您可以改进的是预先分配切片并使用for.. range循环填充它:

s := make([]int, 5)
for i := range s {
    s[i] = rand.Intn(100)
}

math/rand包还有一个rand.Read()函数,用随机字节填充切片。因此,如果您想使用随机数据填充[]byte切片,则只需:

s := make([]byte, 100)
rand.Read(s) // This never returns an error

另一个有趣的方法是利用rand.Rand作为io.Reader。这意味着它有一个Read()方法,用随机数据填充[]byte

结合encoding/binary包,您可以使用随机数据“填充”变量。创建rand.Rand并将r := rand.New(rand.NewSource(time.Now().UnixNano())) s := make([]int32, 5) err := binary.Read(r, binary.BigEndian, &s) if err != nil { panic(err) } fmt.Println(s) 函数作为来源传递给它,就是这样。

这就是它的样子:

[203443513 1611652563 -235795288 8294855 -802604260]

输出:

var point struct{ X, Y int16 }
err = binary.Read(r, binary.BigEndian, &point)
if err != nil {
    panic(err)
}
fmt.Printf("%+v", point)

这很“酷”,甚至可以填充结构,例如:

{X:-15471 Y:2619}

输出:

binary.Read()

binary.Read()上尝试这些示例。

使用int的一个障碍是 - 可以理解 - 它只能填充固定大小类型的值,最着名的例外是常见的[]int类型,其大小不固定(体系结构)依赖)。因此,您无法使用int类型的字段填充int32切片或结构。这就是我在上面的示例中使用int16gcloud iam service-accounts keys create NAME_OF_THE_FILE.json --iam-account=EMAIL 类型的原因。

当然,在这些解决方案中,您无法限制用于填充变量的随机数范围。为此,初始循环仍然更容易。