PHP程序员小白到大牛集训(12期免息)
视频教程分类
推荐视频教程
  • php程序员小白到大牛三个月集训php程序员小白到大牛三个月集训
  • Laravel 9 学习正当时—保姆级教程,想学不会都难!Laravel 9 学习正当时—保姆级教程,想学不会都难!
  • 千万级数据并发解决方案(理论+实战)千万级数据并发解决方案(理论+实战)
  • Laravel基础与实战(模块化)Laravel基础与实战(模块化)
  • UNI-APP开发(仿饿了么)UNI-APP开发(仿饿了么)
  • 首页 >后端开发 >Golang > 正文

    golang怎么生成不重复随机数

    原创2019-12-23 10:46:323541 关注公众号:每天精选资源文章推送

    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怎么生成不重复随机数的详细内容,更多请关注php中文网其它相关文章!

    PHP小白到大牛线上直播班第二十期

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

  • 相关标签:随机数
  • 相关文章

    相关视频


    专题推荐