栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Go语言

golang怎么生成不重复随机数

Go语言 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

golang怎么生成不重复随机数

Go的math/rand包提供了生成随机数的API,重要的API如下:

// 该函数设置随机种子// 若不调用此函数设置随机种子,则默认的种子值为1,由于随机算法是固定的,// 如果每次都以1作为随机种子开始产生随机数,则结果都是一样的,因此一般// 都需要调用此函数来设置随机种子,通常的做法是以当前时间作为随机种子// 以保证每次随机种子都不同,从而产生的随机数也不通// 该函数协程安全func Seed(seed int64)// 以下函数用来生成相应数据类型的随机数,带n的版本则生成[0,n)的随机数。// 注意生成的随机数都是非负数func Float32() float32func Float64() float64func Int() intfunc Int31() int32  // 注意该函数只返回int32表示范围内的非负数,位数为31,因此该函数叫做Int31func Int31n(n int32) int32func Int63() int64func Int63n(n int64) int64func Intn(n int) intfunc Uint32() uint32func Uint64() uint64// 另外,rand包还提供了一个类,接口和上面的大致相同:type Rand struct {    // ...}// 创建一个以seed为种子的源,注意该源不是协程安全的func NewSource(seed int64) Source// 以src为源创建随机对象func New(src Source) *Rand// 设置或重置种子,注意该函数不是协程安全的func (r *Rand) Seed(seed int64)// 下面的函数和全局版本的函数功能一样func (r *Rand) Float32() float32func (r *Rand) Float64() float64func (r *Rand) Int() intfunc (r *Rand) Int31() int32func (r *Rand) Int31n(n int32) int32func (r *Rand) Int63() int64func (r *Rand) Int63n(n int64) int64func (r *Rand) Intn(n int) intfunc (r *Rand) Uint32() uint32func (r *Rand) Uint64() uint64

生成随机数时,以当前时间作为随机种子是个很好的选择,可以用time包生成当前时间:

// 返回当前时间func Now() Time// 为了将Time类型转换为int64类型以作为随机种子// 可以使用如下两个函数:// 返回从1970年1月1日到t的秒数func (t Time) Unix() int64// 返回从1970年1月1日到t的纳秒数func (t Time) UnixNano() int64

例如

package mainimport (    "fmt"    "math/rand"    "time")func main() {    //    // 全局函数    //    rand.Seed(time.Now().Unix())    fmt.Println(rand.Int())       // int随机值,返回值为int    fmt.Println(rand.Intn(100))   // [0,100)的随机值,返回值为int    fmt.Println(rand.Int31())     // 31位int随机值,返回值为int32    fmt.Println(rand.Int31n(100)) // [0,100)的随机值,返回值为int32    fmt.Println(rand.Float32())   // 32位float随机值,返回值为float32    fmt.Println(rand.Float64())   // 64位float随机值,返回值为float64    // 如果要产生负数到正数的随机值,只需要将生成的随机数减去相应数值即可    fmt.Println(rand.Intn(100) - 50) // [-50, 50)的随机值    //    // Rand对象    //    r := rand.New(rand.NewSource(time.Now().Unix()))    fmt.Println(r.Int())       // int随机值,返回值为int    fmt.Println(r.Intn(100))   // [0,100)的随机值,返回值为int    fmt.Println(r.Int31())     // 31位int随机值,返回值为int32    fmt.Println(r.Int31n(100)) // [0,100)的随机值,返回值为int32    fmt.Println(r.Float32())   // 32位float随机值,返回值为float32    fmt.Println(r.Float64())   // 64位float随机值,返回值为float64    // 如果要产生负数到正数的随机值,只需要将生成的随机数减去相应数值即可    fmt.Println(r.Intn(100) - 50) // [-50, 50)的随机值}

以上就是golang怎么生成不重复随机数的详细内容,更多请关注考高分网其它相关文章!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/794205.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号