一尘不染

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

go

或者我必须使用简单的方法,例如:

var arr []int

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

阅读 303

收藏
2020-07-02

共1个答案

一尘不染

您所做的是干净,快速的。您可以改进的是预分配切片,并使用如下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软件包,您可以用随机数据“填充”变量。创建a
rand.Rand并将其binary.Read()作为源传递给函数,仅此而已。

它是这样的:

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}

Go Playground上尝试这些示例。

使用的一个障碍binary.Read()是-可以理解-
它只能填充固定大小类型的值,最著名的例外是普通int类型,其大小不固定(取决于体系结构)。因此,您无法[]int使用int类型字段填充切片或结构。这就是为什么我在上面的示例中使用int32int16类型。

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

2020-07-02