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)