📜  如何在 Golang 中生成随机字符串/字符?

📅  最后修改于: 2022-05-13 01:55:40.910000             🧑  作者: Mango

如何在 Golang 中生成随机字符串/字符?

我们可能希望生成随机字符串甚至字符集来执行某些操作或将某些与字符串相关的功能添加到应用程序中。我们可以从一组字符中随机获取一个字符,随机化一个给定字符串的字符顺序或者生成一个随机字符串。我们可以使用 Golang 中的 rand 编码包。在本文中,我们将了解如何在 Golang 中生成随机字符串。

从字符串中获取随机字符

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

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

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

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

因此,我们可以获取字符串的随机索引并使用该索引访问字符。 Intn函数提供的参数将是字符串的总长度。

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

下面是描述上述解释工作的脚本。

Go
// Go program to generate random characters from the string
package main
  
import (
    "fmt"
    "math/rand"
    "time"
)
  
func main() {
  
    rand.Seed(time.Now().UnixNano())
  
    // String
    charset := "abcdefghijklmnopqrstuvwxyz"
  
    // Getting random character
    c := charset[rand.Intn(len(charset))]
  
    // Display the character
    fmt.Println(string(c))
}


Go
// Go program to generate a random string
package main
  
import (
    "fmt"
    "math/rand"
    "time"
)
  
func main() {
  
    rand.Seed(time.Now().Unix())
    length := 4
  
    ran_str := make([]byte, length)
  
    // Generating Random string
    for i := 0; i < length; i++ {
        ran_str[i] = ran_str(65 + rand.Intn(25))
    }
  
    // Displaying the random string
    str := string(ran_str)
    fmt.Println(str)
}


Go
// Go program to Shuffle a String
package main
  
import (
    "fmt"
    "math/rand"
    "time"
)
  
func main() {
    rand.Seed(time.Now().Unix())
  
    str := "geeksforgeeks"
  
    shuff := []rune(str)
  
    // Shuffling the string
    rand.Shuffle(len(shuff), func(i, j int) {
        shuff[i], shuff[j] = shuff[j], shuff[i]
    })
  
    // Displaying the random string
    fmt.Println(string(shuff))
}


输出:

Generated character:q

生成随机字符串

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

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

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

此外,我们需要确保每次运行脚本时都获得一个新的种子,以便生成唯一的随机数,我们可以使用 time.Now函数来做到这一点。 time.Now函数为我们获取当前时间,我们只需使用 Unix函数将其转换为秒,因为它是一种可行的种子格式。 Unix函数以秒为单位返回时间(从 1971 年 1 月 1 日开始以秒为单位的经过时间)。

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

// Go program to generate a random string
package main
  
import (
    "fmt"
    "math/rand"
    "time"
)
  
func main() {
  
    rand.Seed(time.Now().Unix())
    length := 4
  
    ran_str := make([]byte, length)
  
    // Generating Random string
    for i := 0; i < length; i++ {
        ran_str[i] = ran_str(65 + rand.Intn(25))
    }
  
    // Displaying the random string
    str := string(ran_str)
    fmt.Println(str)
}

输出:

SNOC

随机播放字符串

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

使用随机 Shuffle函数,我们可以将打乱的字符存储到新创建的运行切片中。 Shuffle函数有两个参数,字符串的长度和交换函数。交换函数将简单地采用两个索引(整数),在函数内部,我们可以使用解析的索引交换两个字符,在这种情况下,字符串中的 i 和 j 个索引。

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

// Go program to Shuffle a String
package main
  
import (
    "fmt"
    "math/rand"
    "time"
)
  
func main() {
    rand.Seed(time.Now().Unix())
  
    str := "geeksforgeeks"
  
    shuff := []rune(str)
  
    // Shuffling the string
    rand.Shuffle(len(shuff), func(i, j int) {
        shuff[i], shuff[j] = shuff[j], shuff[i]
    })
  
    // Displaying the random string
    fmt.Println(string(shuff))
}

输出:

eggsekekeorsf