Golang 如何生成唯一随机数数组

Golang 如何生成唯一随机数数组

有时候我们需要一些随机数但不能重复,普通的随机数通常是伪随机的,并且有重复的可能性。假设我们有一组数字范围,并且我们希望在这个范围内以打乱的方式具有n个元素。

使用rand.Perm

简单地说,我们将开始创建一个以任何适当名称并带有.go扩展名的文件。我们将在Golang中使用math random模块,因此需要导入该模块。

// Go程序生成唯一随机数数组
package main

import (
    "fmt"
    "math/rand"
)

func main() {
    permutation := rand.Perm(5)

    fmt.Println(permutation)
} 
Go

输出:

[0 4 2 3 1]
Go

正如我们所看到的,它每次只会随机排列五个对象,但不会在每次运行或迭代后改变顺序。因此,我们并未完全生成随机列表,我们需要每次不同的排列顺序。因此,为此我们使用随机模块与时间模块。我们需要生成一个不同的种子,以便于排列函数来洗牌顺序。默认情况下,种子保持不变,但如果我们将当前时间作为种子,则会生成不同的种子,从而生成相应的顺序。

为了添加这种随机性,我们需要使用时间模块,在其中我们需要获取当前时间,可以使用time.Now()获得,它以日期时间格式给出当前时间。此格式不能用作种子,因此我们使用Unix函数将其转换为秒。Unix函数给出自1970年1月1日以来的秒数。您甚至可以使用UnixNano,UnixMicro或UnixMill。这只是返回以纳秒,微秒和毫秒为单位的Unix秒。

rand.Seed(time.Now().Unix())

因此,如果我们将以下命令添加到脚本中,排列函数将随机生成顺序。

// Go程序生成唯一随机数数组
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().Unix())
    permutation := rand.Perm(5)

    fmt.Println(permutation)
} 
Go

输出:

[4 0 1 2 3]
Go

为列表中的数字定义范围

要定义范围,我们可以从用户输入这些值或仅设置它们为固定值。然而,排列函数不允许输入最小和最大范围,它只返回来自0到n-1范围内的n个数字,并将n作为函数的参数提供。

// Go程序为数字列表定义范围
package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    rand.Seed(time.Now().Unix())
    min := 3
    max := 7
    permutation := rand.Perm(max - min + 1)

    fmt.Println(permutation)
} 
Go

输出:

[3 4 0 1 2]
Go

我们将使用min和max变量来设置最小和最大限制来生成数字。因此,要在所提供的最小和最大范围之间生成数字,我们可以将 max-min+1 传递给函数,因为它会生成所需的数字。我们加上1是因为范围是包括在内的。例如,在这里,min值为3,max值为7,我们明显可以从中选择5个值,即3、4、5、6、7,因此公式max-min+1完美契合。因此,我们有5个数字,并将数字5作为参数传递给Permutation函数,它将以随机顺序呈现从0到5-1的数字,即[0 1 2 3 4]的随机顺序。

为了测试这一点,我们可以添加用户输入用于min-max,并看到排列函数显示数字。

// Go程序:获取用户输入的最小值和最大值,然后显示排列函数的数字
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().Unix())
    var min int
    var max int
    fmt.Print("输入最小数字:")
    fmt.Scan(&min)
    fmt.Print("输入最大数字:")
    fmt.Scan(&max)
    permutation := rand.Perm(max - min + 1)
 
    fmt.Println(permutation)
} 
Go

输出:

Golang 如何生成唯一随机数数组

因此,我们可以看到,在最小值和最大值范围之间的元素数量得到了排列函数的帮助。现在,我们将看看如何实际将这些值放在最小和最大范围之间。

从min到max创建一个具有置换的数组

要在最小值和最大值范围之间获取元素的值,我们只需要将最小限制添加到所有元素中即可。它最终将容纳在给定范围内。

for i := range permutation { 

random_list[i] += min 

} 
Go

因此,这基本上将每个元素移动最小值,因此数字自动进入(最小值,最大值)区间。在将其添加到脚本中后,它最终变为如下所示:

// Go程序:创建一个具有置换的min到max的数组
package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    rand.Seed(time.Now().Unix())
    var min int
    var max int
    fmt.Print("输入最小数字:")
    fmt.Scan(&min)
    fmt.Print("输入最大数字:")
    fmt.Scan(&max)
    random_list := rand.Perm(max - min + 1)
 
    for i := range random_list {
        random_list[i] += min
    }
 
    fmt.Println(random_list)
    /*
    for _, num := range random_list {
        fmt.Println(num)
    }
    */
} 
Go

注释中的代码基本上是在迭代生成的数组,即唯一的随机列表,并逐个打印元素。

Golang 如何生成唯一随机数数组

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册