Golang教程:如何实现随机问候语功能

Golang教程:如何实现随机问候语功能 我正在学习 go.dev/doc/tutorial/random-greeting 上的教程。 我复制了教程中 hello.gogreetings.go 的代码。程序可以运行,但在我的机器上(Ubuntu 24.04),它总是返回相同的问候语。无论我运行多少次,结果都一样,这意味着 rand 函数总是返回相同的索引。

func randomFormat() string {
    // 消息格式的切片。
    formats := []string{
        "Hi, %v. Welcome!",
        "Great to see you, %v!",
        "Hail, %v! Well met!",
    }

    // 通过为格式切片指定一个随机索引,返回随机选择的消息格式。
    return formats[rand.Intn(len(formats))]
}

更多关于Golang教程:如何实现随机问候语功能的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

Dean_Davidson:

func randomFormat() string {
	// A slice of message formats.
	formats := []string{
		"Hi, %v. Welcome!",
		"Great to see you, %v!",
		"Hail, %v! Well met!",
	}
	// Return a randomly selected message format by specifying
	// a random index for the slice of formats.
	return formats[rand.Intn(len(formats))]
}

谢谢,Dean。在我的机器上也是同样的结果。

更多关于Golang教程:如何实现随机问候语功能的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


这很可能只是巧合。此外,rand.Intn 是伪随机的,并非真正的随机。但运行以下代码:

func main() {
	for i := 0; i < 5; i++ {
		fmt.Println(randomFormat())
	}
}

func randomFormat() string {
	// 消息格式的切片。
	formats := []string{
		"Hi, %v. Welcome!",
		"Great to see you, %v!",
		"Hail, %v! Well met!",
	}
	// 通过为格式切片指定一个随机索引,返回一个随机选择的消息格式。
	return formats[rand.Intn(len(formats))]
}

…在 Playground 上产生了以下输出:

Hail, %v! Well met!
Hi, %v. Welcome!
Hi, %v. Welcome!
Hi, %v. Welcome!
Great to see you, %v!

自己运行一下:

Go Playground - The Go Programming Language

在Go中,rand.Intn()默认使用确定性随机数生成器,需要手动设置种子来获得不同的随机序列。使用当前时间戳作为种子是常见做法。

修改greetings.go,在init()函数中设置种子:

package greetings

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

// 初始化随机数种子
func init() {
    rand.Seed(time.Now().UnixNano())
}

func randomFormat() string {
    formats := []string{
        "Hi, %v. Welcome!",
        "Great to see you, %v!",
        "Hail, %v! Well met!",
    }
    
    return formats[rand.Intn(len(formats))]
}

或者从Go 1.20开始,可以使用rand.New(rand.NewSource(time.Now().UnixNano()))创建新的随机数生成器:

func randomFormat() string {
    formats := []string{
        "Hi, %v. Welcome!",
        "Great to see you, %v!",
        "Hail, %v! Well met!",
    }
    
    r := rand.New(rand.NewSource(time.Now().UnixNano()))
    return formats[r.Intn(len(formats))]
}

这样每次运行程序都会得到不同的随机问候语。

回到顶部