如何在Golang中生成唯一随机数数组?
在Golang中生成唯一随机数数组的需求,在实际开发中经常会遇到。本文将介绍如何使用Golang语言生成唯一随机数数组。
前置知识
在本文中,我们需要了解Golang中的rand包和sort包。
rand包
rand包实现了伪随机数生成器。它包括了一些常见的生成器:
- A实现来源于BSD的算法,它采用32位的随机种子。
- B实现是由Guy L. Steele和Landon Curt Noll开发的计算方法生成随机数。
rand包在使用过程中还需要调用math/rand
包,该包提供了生成随机数所需的算法。
sort包
sort包实现了内存中排序的函数,支持排序的数据结构包括切片和用户自定义的集合类型。
实现方法
方法一:生成一定范围内的不重复随机数
在这种情况下,我们需要生成一定范围内的不重复随机数。我们可以考虑使用rand.Perm函数,该函数会返回一连串随机的连续整数,这些整数是0到n-1的随机排列。例如在0到10之间生成不重复随机数可以使用以下代码:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
arr := rand.Perm(10)
fmt.Println(arr)
}
上述代码中,使用rand.Seed函数将系统时间的纳秒部分作为随机的种子,使得每次执行的结果都不同。然后使用rand.Perm(10)函数生成长度为10的整数数组。
方法二:生成指定长度的不重复随机数
在这种情况下,我们需要生成指定长度的不重复随机数。首先,我们考虑生成一定范围内的随机数,在此基础上,我们对随机数进行去重,并根据需求取前n个随机数。下面是一个例子,生成长度为5的不重复随机数:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
var arr []int
for {
n := rand.Intn(10)
for _, v := range arr {
if v == n {
continue
}
}
arr = append(arr, n)
if len(arr) == 5 {
break
}
}
fmt.Println(arr)
}
上述代码中,使用rand.Seed函数将系统时间的纳秒部分作为随机的种子,使得每次执行的结果都不同。然后定义一个长度为0的int类型数组arr,以此数组为基础生成随机数,并进行去重操作,直到数组长度为指定的长度时停止生成。这样就可以生成指定长度的不重复随机数了。
方法三:生成指定范围内的唯一随机数
在这种情况下,我们需要生成指定范围内的唯一随机数。我们考虑生成一定范围内的随机数,并对随机数进行去重。下面是一个例子,生成0到10之间的不重复随机数。
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
var arr []int
for {
n := rand.Intn(11)
for _, v := range arr {
if v == n {
continue
}
}
arr = append(arr, n)
if len(arr) == 11 {
break
}
}
fmt.Println(arr)
}
上述代码中,使用rand.Seed函数将系统时间的纳秒部分作为随机的种子,使得每次执行的结果都不同。然后定义一个长度为0的int类型数组arr,以此数组为基础生成随机数,并进行去重操作,直到数组长度为指定的长度时停止生成。这样就可以生成任意指定范围内的唯一随机数了。
结论
本文介绍了如何在Golang中生成唯一随机数数组。我们可以通过rand.Perm函数、自定义长度的不重复随机数和指定范围内的唯一随机数三种方法来实现。当我们需要在Golang中生成随机数数组的时候,可以根据实际需要选择合适的方法。