Go的随机数及6位验证码生成 - Go语言中文社区

Go的随机数及6位验证码生成


1.rand库

随机函数在语言里有两个包,分别是“math/rand”和“crypto/rand”。

“math/rand”的rand包实现了伪随机数生成器。该包里有 exp.go,normal.go,rand.go,rng.go,zipf.go 。

"crypto/rand"的rand包实现了用于加解密的更安全的随机数生成器。该包里有rand.go,rand_linux.go,rand_unix.go,rand_windows.go,util.go。

2.随机数

go的伪随机代码

package main
import (
	"fmt"
	"math/rand"
)
func main() {
	for i := 0; i < 10; i++ {
		fmt.Println(rand.Int())
	}
}


你会发现,不管运行多少次,这十组数据都一样的。那怎么办呢?

想到了设置一个随机种子,种子数字为10好了。如下:

package main
import (
	"fmt"
	"math/rand"
)
func main() {
<pre name="code" class="plain">	rand.New(rand.NewSource(10))
for i := 0; i < 10; i++ {fmt.Println(rand.Int())}}
然后你又会发现跟上面还是一样的,再运行也还是一样的。于是你猜想,跟种子没有关系啊?不是,因为这个时候的rand是默认的。看源码就明白,原来rand.Int()下的随机数都是以1为种子。rand相当于默认的全局。

于是就有了一下代码:

package main
import (
	"fmt"
	"math/rand"
)
func main() {
	rnd := rand.New(rand.NewSource(10))
	for i := 0; i < 10; i++ {
		fmt.Println(rnd.Int())
	}
}

终于不一样了,于是你终于领悟了吧。如果想要每次运行不一样的话,那就改成“活种”。代码如下:
package main
import (
	"fmt"
	"math/rand"
	"time"
)
func main() {
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	for i := 0; i < 10; i++ {
		fmt.Println(rnd.Int())
	}
}

3.六位数验证码

package main
import (
	"fmt"
	"math/rand"
	"time"
)
func main() {
	rnd := rand.New(rand.NewSource(time.Now().UnixNano()))
	vcode := fmt.Sprintf("%06v", rnd.Int31n(1000000))
	fmt.Println(vcode)
}






		rand.NewSource(10)
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Libra412/article/details/41925051
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 20:48:36
  • 阅读 ( 2866 )
  • 分类:Go

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢