Go语言学习之键盘输入与随机数|Go主题月

871 阅读2分钟

作者:看那个码农

公众号:看那个码农

上期内容介绍了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)
}

输出为:

image.png

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)
}

输出为:

image.png

方式一与方式二对比

  • 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)
}

输出为:

image.png

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())
   }

}

输出为:

image.png

我们利用time包对比不同时间运行上面程序的结果:

image.png

我们发现生成的随机数结果完全一致。

为什么?

  • func (r *Rand) Int() int
  • func (r *Rand) Intn(n int) int
  • func (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)
   }

}

输出为:

image.png

我们对比一下,不同时刻的输出是否一致:

image.png

生成的随机数二者不一致!!!

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
}

输出为:

image.png

如果你觉得这篇内容对你有帮助的话:

1、点赞支持下吧,让更多的人也能看到这篇内容

2、关注公众号:看那个码农,我们一起学习一起进步。