golang生成不重复随机数的方法-创新互联

这篇文章主要为大家详细介绍了golang生成不重复随机数的方法,文章中的示例代码非常详细,若有兴趣可以学习参考,闲言少叙直接上代码:

10年的阜宁网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。营销型网站的优势是能够根据用户设备显示端的尺寸不同,自动调整阜宁建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。成都创新互联公司从事“阜宁网站设计”,“阜宁网站推广”以来,每个客户项目都认真落实执行。

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

// 该函数设置随机种子
// 若不调用此函数设置随机种子,则默认的种子值为1,由于随机算法是固定的,
// 如果每次都以1作为随机种子开始产生随机数,则结果都是一样的,因此一般
// 都需要调用此函数来设置随机种子,通常的做法是以当前时间作为随机种子
// 以保证每次随机种子都不同,从而产生的随机数也不通
// 该函数协程安全
func Seed(seed int64)

// 以下函数用来生成相应数据类型的随机数,带n的版本则生成[0,n)的随机数。
// 注意生成的随机数都是非负数
func Float32() float32
func Float64() float64
func Int() int
func Int31() int32  // 注意该函数只返回int32表示范围内的非负数,位数为31,因此该函数叫做Int31
func Int31n(n int32) int32
func Int63() int64
func Int63n(n int64) int64
func Intn(n int) int
func Uint32() uint32
func 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() float32
func (r *Rand) Float64() float64
func (r *Rand) Int() int
func (r *Rand) Int31() int32
func (r *Rand) Int31n(n int32) int32
func (r *Rand) Int63() int64
func (r *Rand) Int63n(n int64) int64
func (r *Rand) Intn(n int) int
func (r *Rand) Uint32() uint32
func (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 main
import (
    "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生成不重复随机数的方法,具体使用情况还需要大家自己动手实验使用过才能领会。如果想了解更多相关内容,欢迎关注创新互联成都网站设计公司行业资讯频道!

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻标题:golang生成不重复随机数的方法-创新互联
文章起源:http://ybzwz.com/article/dsjsgg.html