Golang 如何生成随机字符串/字符

Golang 如何生成随机字符串/字符

我们可能想要生成随机字符串或一组字符,以执行某些操作或将某些与字符串相关的功能添加到应用程序中。我们可以从一组字符中随机获取一个字符,在给定字符串的字符顺序上进行随机或生成随机字符串。我们可以在Golang中使用rand,encoding包。在本文中,我们将看到如何在Golang中生成随机字符串。

从字符串中获取随机字符

假设我们想要从a到z中获取一个随机字母,我们不能硬编码它们为特定的值,我们需要一种伪随机的方式来从一个字符串中获取一个字符。我们将使用rand模块从给定字符串中选择一个随机字符。

首先,我们创建一个包含其中所有字符集的字符串。这将只是Go语言中的字符串,因为我们在双引号中定义它。

charset := “abcdefghijklmnopqrstuvwxyz”

上述字符串可以是您想要获取随机字符的任何内容。

接下来,我们需要从字符串中随机选择一个字符,我们可以通过在Golang中导入rand包来实现。 rand函数有一个名为Intn的函数,它在0(包括)到提供的数字(不包括)之间生成随机数字。因此,它基本上将整数(例如n)作为参数,并返回0到n-1之间的任何随机数字。

因此,我们可以通过这种方式获得字符串的随机索引,并使用该索引访问字符。提供给Intn函数的参数将是字符串的总长度。

charset[rand.Intn(len(charset))]

我们将在变量中存储上述输出,因此我们从字符串中选择了一个随机字符。我们还需要确保每次运行程序时生成不同的种子,我们可以使用Golang中的time包中的time.Now函数来实现这一点。我们需要将时间转换为秒,我们可以使用Unix函数或UnixNano / UnixMilli / UnixMicro函数来完成,它们分别将时间转换为秒,纳秒,毫秒和微秒,简单地使用Unix也可以正常工作。

以下是展示上述说明的脚本。

// 从字符串中生成随机字符的Go程序
package main
  
import (
    "fmt"
    "math/rand"
    "time"
)
  
func main() {
  
    rand.Seed(time.Now().UnixNano())
  
    // 字符串
    charset := "abcdefghijklmnopqrstuvwxyz"
  
    // 获取随机字符
    c := charset[rand.Intn(len(charset))]
  
    // 输出字符
    fmt.Println(string(c))
} 
Go

输出:

生成的字符:q
Go

生成随机字符串

我们可以使用一些随机数字生成和字符代码算法来生成随机字符串。首先,我们将定义字符串的长度,它可以是您喜欢的任何内容。接下来,我们需要创建一个预定义大小的字节切片。字节是Golang中的一种数据类型,您可以在官方文档中了解更多信息。然后,我们将遍历字节切片,并使用特定范围内的随机字符进行填充。由于Golang中的字节接受ASCII字符代码,因此我们可能需要参考ASCII表以了解要从中生成的字符的代码。

length := 4

ran_str := make([]byte, length)

上述代码段定义了长度为4的字符串,然后使用make函数创建了一个具有此长度的字节切片。

我们仅会生成大写字母,因此我们将为每个字符分配代码65,并添加一个介于0到25之间的随机整数,即我们将能够生成从65到90的代码。由于我们将有26个字母的26个代码,现在如果您查看65到90,则是ASCII中A到Z字符的字符代码。因此,我们将使用这些随机生成的字符填充字节切片作为字节。

for i := 0; i < length; i++ {

ran_str[i] = ran_str(65 + rand.Intn(25))

}

在生成字节片后,我们可以通过将字节片与字符串连接来获得字符串变量中的片段。

str := string(ran_str)

并且,我们需要确保每次运行脚本时都获得新的种子,以生成唯一的随机数,我们可以使用time.Now函数来执行该操作。 time.Now函数获取当前时间,我们只需使用Unix函数将其转换为秒,因为它是一种可行的种子格式。 Unix函数以秒为单位返回时间(自1971年1月1日以来的经过时间)。

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

因此,通过总结上述解释,我们可以编写脚本以生成随机字符串。

//生成随机字符串的Go程序
package main

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

func main() {

    rand.Seed(time.Now().Unix())
    length := 4

    ran_str := make([]byte, length)

    //生成随机字符串
    for i := 0; i < length; i++ {
        ran_str[i] = ran_str(65 + rand.Intn(25))
    }

    //显示随机字符串
    str := string(ran_str)
    fmt.Println(str)
} 
Go


输出:

> SNOC
Go

打乱一个字符串

我们甚至可以在Golang中打乱字符串的字符,我们可以使用Golang中rand模块中的Shuffle函数。提供了一个字符串,我们可以编写一个交换函数来交换字符串中的两个字符。我们首先定义一个字符串,可以是您希望打乱的任何内容。接下来,我们可以声明一个rune切片,用于存储新的打乱字符串。

str := “geeksforgeeks”

shuff := []rune(str)

使用随机的Shuffle函数,我们可以将打乱的字符存储到新创建的run切片中。 Shuffle函数接受两个参数,字符串长度和交换函数。交换函数将简单地获取两个索引(整数),并在函数内部使用在该字符串中解析的这两个索引即i和j th索引交换两个字符。

rand.Shuffle(len(shuff), func(i, j int) {

shuff[i], shuff[j] = shuff[j], shuff[i]

})

因此,使用上述逻辑和说明,我们可以创建脚本,还应添加time.Now函数,每次调用Shuffle函数时,都应具有新的种子。现在,为了为程序执行生成新的种子,我们将使用当前时间作为种子。我们可以使用time.Now函数生成种子,然后获取Unix秒(自1970年1月1日以来的时间)。

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

//Shuffle a String的Go程序
package main

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

func main() {
    rand.Seed(time.Now().Unix())

    str := "geeksforgeeks"

    shuff := []rune(str)

    //打乱字符串
    rand.Shuffle(len(shuff), func(i, j int) {
        shuff[i], shuff[j] = shuff[j], shuff[i]
    })

    //显示随机字符串
    fmt.Println(string(shuff))
} 
Go

输出:

>>  eggsekekeorsf
Go

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册