作者:看那个码农
公众号:看那个码农
上期内容介绍了Go语言学习之math包常用操作总结|Go主题月
- math包常用操作总结
本篇内容将继续带领大家走进Go语言的世界。
1.本文简介
Go语言学习之键盘输入与随机数
2.键盘输入
在Go语言中读取键盘输入x常有3种方式。
2.1 fmt.Scan(&x)
方式一:fmt.Scan(&x)
用法如下:
package main
import (
"fmt"
)
func main() {
var x int
fmt.Println("请输入一个整数:")
fmt.Scan(&x)
fmt.Printf("读取到内容:%d",x)
}
输出为:
2.2 fmt.Scanln(&x)
方式二:fmt.Scanln(&x)
用法如下:
package main
import (
"fmt"
)
func main() {
var x int
fmt.Println("请输入一个整数:")
fmt.Scanln(&x)
fmt.Printf("读取到内容:%d",x)
}
输出为:
方式一与方式二对比:
-
scan函数会识别空格左右的内容,哪怕换行符号存在也不会影响
scan对内容的获取。 -
scanln函数会识别空格左右的内容,但是一旦遇到换行符就会立即结束,不论后续还是否存在需要带输入的内容。
2.3 bufio
方式三:
reader := bufio.NewReader(os.Stdin)
res,_ := reader.ReadString('\n')
用法如下:
package main
import (
"bufio"
"fmt"
"os"
)
func main() {
fmt.Println("请输入一个整数:")
reader := bufio.NewReader(os.Stdin)
res,_ := reader.ReadString('\n')
fmt.Printf("读取到内容%s\n",res)
}
输出为:
3.随机数
在Go语言中常使用“math/rand”实现伪随机数生成器,能够生成整型和浮点型的随机数。
常用的方法如下:
func (r *Rand) Int() int
返回一个非负的伪随机int值。
func (r *Rand) Intn(n int) int
返回一个取值范围在[0,n]的伪随机int值,如果n<=0会panic。
如果需要获取[m,n]的随机数
则应该如下操作:
随机数=rand.Intn(n-m+1)+m
func (r *Rand) Float64() float64
返回一个取值范围在[0.0,1.0)的伪随机float64值。
用法如下:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
for i:=1;i < 6;i++{
fmt.Printf("第%v次生成随机int数为:%v\n",i,rand.Int())
}
fmt.Printf("当前时间为:%v\n",time.Now())
for i2:=1;i2 < 6;i2++{
fmt.Printf("第%v次生成随机intn(10)数为:%v\n",i2,rand.Intn(10))
}
fmt.Printf("当前时间为:%v\n",time.Now())
for i3:=1;i3 < 6;i3++{
fmt.Printf("第%v次生成随机Float64数为:%v\n",i3,rand.Float64())
}
}
输出为:
我们利用time包对比不同时间运行上面程序的结果:
我们发现生成的随机数结果完全一致。
为什么?
func (r *Rand) Int() intfunc (r *Rand) Intn(n int) intfunc (r *Rand) Float64() float64
上面的这三种函数是伪随机函数,不管运行多少次都只会返回同样的随机数,因为它默认的资源就是单一值,所以必须调用 rand.Seed(), 并且传入一个变化的值作为参数,如time.Now().UnixNano(), 就是可以生成时刻变化的值。
用法如下:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
rand.Seed(time.Now().UnixNano())
for i:=1;i < 6;i++{
fmt.Printf("第%v次生成随机int数为:%v\n",i,rand.Int())
}
fmt.Printf("当前时间为:%v\n",time.Now())
for i2:=1;i2 < 6;i2++{
fmt.Printf("第%v次生成随机intn(10)数为:%v\n",i2,rand.Intn(10))
}
fmt.Printf("当前时间为:%v\n",time.Now())
for i3:=1;i3 < 6;i3++{
fmt.Printf("第%v次生成随机Float64数为:%v\n",i3,rand.Float64())
}
for i4:=1;i4 < 6;i4++{
fmt.Printf("第%v次生成[5,11]的随机数为:%v\n",i4,rand.Intn(7)+5)
}
}
输出为:
我们对比一下,不同时刻的输出是否一致:
生成的随机数二者不一致!!!
4.键盘输入&随机数
我们来看看一个键盘输入加随机数的案例。
猜数字游戏
代码如下:
package main
import (
"fmt"
"math/rand"
"time"
)
func main() {
playgame()
}
func playgame() {
//获取[m,n]范围内的随机数
target:=Randnum(10,100)
fmt.Println("请输入随机数:")
fmt.Println("--------------")
//记录猜测的次数
count:=0
for{
count++
number:=0
fmt.Scanln(&number)
if number<target{
fmt.Println("打错了,数字小了,再接再厉哟!")
}else if number>target{
fmt.Println("答错了,数字大了,再接再厉哟!")
}else{
fmt.Println("恭喜您!答对了!")
fmt.Printf("您一共猜测了%v次!欢迎下次再来!\n",count)
fmt.Println("--------------")
playgame()
}
alterInfo(count,target)
}
}
//错误提示
func alterInfo(count,target int) {
if count>=6{
fmt.Printf("您一共猜了%v次都没有猜中!",count)
fmt.Println("正确数字为:",target)
playgame()
}
}
//生成随机数
func Randnum(min,max int) int {
rand.Seed(time.Now().UnixNano())
return rand.Intn(max-min+1)+min
}
输出为:
如果你觉得这篇内容对你有帮助的话:
1、点赞支持下吧,让更多的人也能看到这篇内容
2、关注公众号:看那个码农,我们一起学习一起进步。