go语言的随机数,不是真正的随机,而是根据一定的公式算法计算出来的,也称伪随机数
随机数操作都在math/rand包下

一、生成一个随机数

请注意,未设定种子数而产生的随机数是固定数,下面的代码,无论执行多少次,输出结果都是一样的

package main

import (
	"fmt"
	"math/rand"
)

func main() {
	r := rand.Int()
	fmt.Println(r)
}

多次输出:
5577006791947779410
5577006791947779410


当指定了数值范围再执行,会产生不同随机数吗?
事实上也不会,仅指定范围,种子数未设定,每次运行产生的随机也是固定值

func main() {
	for i := 0; i < 5; i++ {
		r := rand.Intn(10)
		fmt.Printf("%d,", r)
	}
}

多次输出:
1,7,7,9,1,
1,7,7,9,1,


rand.Seed(seed)
设定种子数后,再执行会产生不同的随机数吗?答案是否定的,多次执行还是输出一样的结果,原因是相同种子数只产生相同的随机数

func main() {
	rand.Seed(100)	
	for i := 0; i < 5; i++ {
		r := rand.Intn(10)
		fmt.Printf("%d,", r)
	}
}

多次执行输出:
3,8,0,0,2,
3,8,0,0,2,

二、生成随机的随机数

每次执行时更新种子数会产生不同的随机数,
时间作为种子数
这里有一个坑:如果seed值固定,那么每次程序重启后重新生成随机数会重复上一次的随机数

package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	rand.Seed(time.Now().UnixNano())
	fmt.Printf("%d, ", rand.Intn(100))
	fmt.Printf("%d, ", rand.Int())
}

多次输出:
9, 7259445416375718725,
29, 8751451573146163832,

三、指定范围随机数

0-100随机数

rand.Seed(time.Now().UnixNano())
r := rand.Intn(100)
fmt.Println(r)

输出:
53
81

100-1000随机数

由于go语言未提供2个区间参数,只一个参数的情况下先随机0到(m-n),再用加 n的方式解决

生成0-900随机数,加100即可

rand.Seed(time.Now().UnixNano())
r := rand.Intn(900) + 100
fmt.Println(r)

输出:
105
651

5000-90000随机数

生成0-85000随机数,加5000即可

rand.Seed(time.Now().UnixNano())
r := rand.Intn(85000) + 5000
fmt.Println(r)

输出:
27000
61201

四、真随机 crypto/rand

package main

import (
	"fmt"
	"crypto/rand"
)

func main() {
   for i := 0; i < 4; i++  {
      n, _ := rand.Int(rand.Reader, big.NewInt(100))
      println(n.Int64())
   }
}

输出:
85
9
56
52

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐