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

Ken*_*tov -3 random sample go slice

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

var arr []int

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

icz*_*cza 6

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

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

math/rand软件包还具有一个rand.Read()用随机字节填充切片的功能.因此,如果您想[]byte用随机数据填充切片,这就是所需要的:

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

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

这与encoding/binary包相结合,您可以使用随机数据"填充"变量.创建并传递rand.Randbinary.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)
Run Code Online (Sandbox Code Playgroud)

输出:

[203443513 1611652563 -235795288 8294855 -802604260]
Run Code Online (Sandbox Code Playgroud)

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

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

输出:

{X:-15471 Y:2619}
Run Code Online (Sandbox Code Playgroud)

Go Playground上试试这些例子.

使用的一个障碍binary.Read()是 - 可以理解 - 它只能填充固定大小类型的值,最着名的例外是常见int类型,其大小不固定(取决于架构).因此,您无法[]int使用int类型字段填充切片或结构.这就是我在上面的例子中使用int32和输入的原因int16.

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