猜谜游戏
随机数
go语言的随机数,不是真正的随机,而是根据一定的公式算法计算出来的,也称伪随机数;随机数操作都在math/rand包下。
在生成随机数时,未设定种子数而产生的随机数是固定数,也就是说无论执行多少次,输出结果都是一样的.
如果要在每次执行时产生不同的随机数,我们要使用时间作为种子数。
这里我们需要注意的是如果seed值固定,那么每次程序重启后重新生成随机数会重复上一次的随机数。如下:
func main() {
rand.Seed(time.Now().UnixNano()) // 使用当前时间的纳秒数作为种子
fmt.Println(rand.Intn(100)) // 生成0到100之间的随机整数
}
当然,我们可以生成指定范围内的随机数,这时候我们就需要定义一个函数来实现:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
fmt.Println(random(1, 20)) // 生成1到20之间的随机整数
}
func random(min, max int) int {
return rand.Intn(max-min) + min
}
当然不是用函数也行,最重要的是记住公式rand.Intn(max-min) + min;max是最大值,min是最小值;
读取用户输入---fmt(scan..) & bufio
在视频中使用的是bufio包来读取用户输入,但也提到可以使用scan包来读取,因此,对两种包都看看;
fmt包:
- fmt.scan
- fmt.scanf
- fmt.scanln
- scan 的使用:
func Scan(a ...interface{}) (n int, err error);参数间以空格或回车键进行分割。 如果输入的参数不够接收的,按回车后仍然会等待其他参数的输入。如果输入的参数大于接收的参数,只有给定数量的参数被接收,其他参数自动忽略。 - Scanf:
func Scanf(format string, a ...interface{}) (n int, err error);同样,Scanf也可以接收多个参数,但是接收字符串的话,只能在最后接收; 否则按照"%s%d"的格式进行接收,无论输入多少字符(包含数字),都会被认定是第一个字符串的内容,不会被第二个参数所接收。 - Scanln:
func Scanln(a ...interface{}) (n int, err error);Scanln与Scan类似,但在换行时停止扫描,并且在最后一项之后必须有换行或EOF。
bufio包:
在 Go 语言中,bufio包实现了有缓冲的 I/O 操作。当读取用户输入时,它可以提供更高效的读取方式。通过bufio.Reader类型,可以从标准输入(os.Stdin)读取数据,并且能够按行或者其他方式处理输入内容。
示例如下:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
reader := bufio.NewReader(os.Stdin)
fmt.Print("请输入内容:")
input, err := reader.ReadString('\n')
if err!= nil {
fmt.Println("读取输入出错:", err)
return
}
// 去掉换行符
input = input[:len(input)-1]
fmt.Println("你输入的内容是:", input)
}
- 首先导入了
bufio、fmt和os这三个包。bufio用于缓冲 I/O 操作,fmt用于格式化输出,os用于访问操作系统功能,这里主要是访问标准输入。 - 然后通过
bufio.NewReader(os.Stdin)创建了一个bufio.Reader对象reader,它将从标准输入读取数据。 - 接着使用
reader.ReadString('\n')来读取用户输入,直到遇到换行符\n为止。读取的内容存储在input变量中,并且会返回一个可能的错误err。 - 如果读取过程中出现错误,会打印错误信息并结束程序。如果没有错误,会去掉输入字符串末尾的换行符(因为
ReadString会把换行符也读取进来),最后打印出用户输入的内容。