300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 【Golang】生成随机数 指定区间随机数

【Golang】生成随机数 指定区间随机数

时间:2020-07-21 09:23:38

相关推荐

【Golang】生成随机数 指定区间随机数

go语言的随机数,不是真正的随机,而是根据一定的公式算法计算出来的,也称伪随机数

随机数操作都在math/rand包下

一、生成一个随机数

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

package mainimport ("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 mainimport ("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) + 100fmt.Println(r)

输出:

105

651

5000-90000随机数

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

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

输出:

27000

61201

四、真随机 crypto/rand

package mainimport ("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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。