如何在golang中获取随机数样本?
How to get a sample of random numbers in golang?
或者我必须使用直接的方式,例如:
var arr []int
for i := 0; i < 5; i++ {
arr = append(arr, rand.Intn(100))
}
你做的足够干净和快速。您可以改进的是预先分配切片并使用 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
being an io.Reader
。这意味着它有一个 Read()
方法,可以用随机数据填充 []byte
。
这与作为源的encoding/binary
package, you can "fill" variables with random data. Create and pass a rand.Rand
to the 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]
这 "cool" 足以填充结构,例如:
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
切片或结构。这就是为什么我在上面的示例中使用了 int32
和 int16
类型。
当然,在这些解决方案中,您无法限制用于填充变量的随机数范围。为此,初始循环仍然更容易。
或者我必须使用直接的方式,例如:
var arr []int
for i := 0; i < 5; i++ {
arr = append(arr, rand.Intn(100))
}
你做的足够干净和快速。您可以改进的是预先分配切片并使用 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
being an io.Reader
。这意味着它有一个 Read()
方法,可以用随机数据填充 []byte
。
这与作为源的encoding/binary
package, you can "fill" variables with random data. Create and pass a rand.Rand
to the 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]
这 "cool" 足以填充结构,例如:
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
切片或结构。这就是为什么我在上面的示例中使用了 int32
和 int16
类型。
当然,在这些解决方案中,您无法限制用于填充变量的随机数范围。为此,初始循环仍然更容易。