👻创作者:丶重明
👻创作时间:2025年3月16日
👻擅长领域:运维
目录
1.😶🌫️题目:猜数字游戏
编写一个猜数字的小游戏。计算机会随机生成一个 1 到 100 之间的整数,然后玩家通过输入数字来猜测。每次猜测后,计算机会告诉玩家猜的数字是大了、还是小了,直到玩家猜对为止。
要求 :
- 程序会随机生成一个数字(范围 1 到 100)。
- 玩家输入一个数字作为猜测。
- 如果猜测的数字小于目标数字,程序提示 "太小了"。
- 如果猜测的数字大于目标数字,程序提示 "太大了"。
- 当猜中数字时,程序会输出 "恭喜你猜对了!" 并显示玩家猜测的次数。
2.😶🌫️代码开发
使用Go语言进行代码开发
go
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
target := rand.Intn(100) + 1
var guess int
attempts := 0
fmt.Println("猜数字游戏现在开始!")
fmt.Println("我已经选择了一个 1 到 100 之间的数字,请你猜一猜!")
for {
attempts++
fmt.Print("请输入你的猜测: ")
fmt.Scan(&guess)
if guess < target {
fmt.Println("你的猜测太小了,请再试一次。")
} else if guess > target {
fmt.Println("你的猜测太大了,请再试一次。")
} else {
fmt.Printf("恭喜你,猜对了!你用了 %d 次尝试。\n", attempts)
break
}
}
}
3.😶🌫️代码输出
保存代码文件,执行go run
运行代码
go
> go run .\9.gotest.go
猜数字游戏现在开始!
我已经选择了一个 1 到 100 之间的数字,请你猜一猜!
请输入你的猜测: 50
你的猜测太大了,请再试一次。
请输入你的猜测: 30
你的猜测太小了,请再试一次。
请输入你的猜测: 40
你的猜测太大了,请再试一次。
请输入你的猜测: 35
你的猜测太大了,请再试一次。
请输入你的猜测: 33
你的猜测太小了,请再试一次。
请输入你的猜测: 34
恭喜你,猜对了!你用了 6 次尝试。
4.😶🌫️代码解析
go
rand.Seed(time.Now().UnixNano())
rand.Seed
是Go语言中用于设置随机数生成器种子的函数,种子是随机数生成算法的起点,它决定了生成的随机数序列。
time.Now()
返回当前的时间,一个Time类型的对象,然后通过.UnixNano()
将时间转换为自1970年1月1日以来的纳秒数。
如果不设置种子,那么默认会使用一个固定的种子值,这样每次运行程序时,生成的随机数都是相同的。
time.Now().UnixNano()
返回的纳秒数在每次程序启动时都是不同的,因此它能作为一个良好的种子,确保每次运行程序时生成的随机数都是不同的
go
target := rand.Intn(100) + 1这句什么意思
rand.Intn(100)
会生成一个0-99的随机整数,为了避免生成0和不能生成00,所以需要+1
,这样取值范围就是1-100。
后续内容就是一个for
循环中运行判断逻辑,每完成一次循环,attempts
的值加1,直到猜中数字后,执行break
退出循环。
5.😶🌫️本文知识点
5.1.😶🌫️math/rand包
math/rand
是一个标准库包,主要用于生成伪随机数。
以下是一些常见的函数:
功能 | 方法 | 示例 |
---|---|---|
基础随机整数 | Intn(n) | rand.Intn(100) → 0~99 |
自定义范围整数 | Intn(max-min) + min | rand.Intn(50)+10 → 10~59 |
随机浮点数 | Float64() | rand.Float64() → 0.0~1.0 |
随机排列 | Perm | rand.Perm(5) → [3,1,4,0,2] |
设置随机种子 | Seed(seed) | rand.Seed(time.Now().UnixNano()) |
本文使用的就是math/rand
包的Intn(n)
方法和Seed
方法。
5.2.😶🌫️time包
time
包也是Go语言标准库包之一,用于处理时间相关的问题。
以下有几个常见的使用方法供参考:
- 获取当前时间
go
// 获取正常格式的当前时间:2023-10-05 14:30:15.123456 +0800 CST
time.Now()
// 获取UTC格式的当前时间:
time.Now().UTC()
- 获取时间戳
go
// 获取秒级别的时间戳
now.Unix()
// 获取毫米级时间戳
now.UnixMilli()
// 获取纳秒级时间戳,也是本文所使用的方法
now.UnixNano()
更多内容请查看官方手册
6.😶🌫️扩展:密码学安全的随机数
math/rand
生成的随机数可用于一般使用场景,因为结果是可预测的。
如果需生成密码学安全(Cryptographically Secure)的随机数(如密钥、令牌、密码等敏感数据),必须使用标准库中的 crypto/rand
包。
crypto/rand
包基于操作系统提供的安全熵源,生成的随机数具有密码学强度。
例如:生成随机字符串
go
package main
import (
"crypto/rand"
"fmt"
)
func main() {
// 生成 16 字节随机盐值
salt := make([]byte, 16)
_, err := rand.Read(salt)
if err != nil {
panic(err)
}
fmt.Println("盐值 (Hex):", fmt.Sprintf("%x", salt))
}
输出结果:
go
> go run .\10.gotest.go
盐值 (Hex): a6cbf72c30d584fba7a1794cc511258e
同系列: