详解Go语言中rand(随机数)包的使用

 更新时间:2022年08月16日 09:47:42   作者:Hann Yang  
在Golang中,有两个包提供了rand,分别为math/rand和crypto/rand对应两种应用场景。math/rand包实现了伪随机数生成器。也就是生成 整形和浮点型;crypto/rand包实现了用于加解密的更安全的随机数生成器。本文就来和大家详细讲讲math/rand的使用

包"math/rand"

随机数生成器,可以生成 整型或浮点型 的伪随机数。

随机数种子

不同的种子生成不同的随机数,无种子编译后运行的结果是定值。

通常以时钟作为参数初始化,rand.Seed(time.Now().UnixNano())。

随机函数

rand.Int()

返回一个随机整数

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    nums := make([]int, 3)
    rand.Seed(time.Now().UnixNano())
    for j := 0; j < 10; j++ {
        for i := 0; i < 3; i++ {
            nums[i] = rand.Int()
            fmt.Print(nums[i])
            fmt.Print("\t")
        }
        fmt.Println()
    }
}

输出样例:

8547983782177664082 3052552994446827557 8765581018699603124

5361649810688880538 7247555699230090626 6921521756094709862

7061225496098313961 4043787731930393944 4881510333544611431

2742623498123161832 8826061491064266771 7540769746514898360

1640562288017497602 7737908637884326151 927535944994878966

7393177581525888978 6511469144479537097 5004275440415177087

88816382525065439     4249346871495670764 8192005441386526629

5523554829668683712 69312977258692669     6584352354533757392

3124007232705319196 5635727296343069158 4284023996891098234

3861142140259007378 4879978992907007455 473741157600402359

rand.Intn(n)

返回0~n间不包括n的非负整数

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    nums := make([]int, 8)
    rand.Seed(time.Now().UnixNano())
    for j := 0; j < 10; j++ {
        for i := 0; i < 8; i++ {
            nums[i] = rand.Intn(100)
            fmt.Print(nums[i])
            fmt.Print("\t")

输出样例: 

40    63    3    47    76    78    21    44    
43    40    12    87    94    90    97    68    
0    47    14    71    42    52    20    72    
86    57    78    65    53    77    75    70    
76    26    63    40    57    75    77    82    
86    4    46    25    2    67    46    0    
53    64    70    37    59    41    47    63    
80    3    85    42    1    47    31    7    
2    6    2    40    33    49    30    32    
68    90    74    51    40    57    92    97

注:   rand.Intn(100) 与 rand.Int()%100 效果相近。

实例

红球 1-33 选择6个 不能重复;蓝球 1-16 选择1个;蓝球和红球可以重复

package main
 
import (
    "fmt"
    "math/rand"
    "time"
)
 
func main() {
    red := make([]int, 6)
    rand.Seed(time.Now().UnixNano())
 
    for i := 0; i < len(red); i++ {
        t := rand.Intn(33) + 1
        for j := 0; j < i; j++ {
            if t == red[j] {
                t = rand.Intn(33) + 1
                j--
            }
        }
        red[i] = t
    }
    fmt.Println("红球:", red, "\n蓝球:", rand.Intn(16)+1)
}

输出:

红球: [25 28 19 26 33 14]
蓝球: 7

其他随机函数

按类型随机类

func (r *Rand) Int31() int32
func (r *Rand) Int63() int64
func (r *Rand) Uint32() uint32
func (r *Rand) Float32() float32  // 返回一个取值范围在[0.0, 1.0)的伪随机float32值
func (r *Rand) Float64() float64  // 返回一个取值范围在[0.0, 1.0)的伪随机float64值

指定随机范围类

func (r *Rand) Int31n(n int32) int32
func (r *Rand) Int63n(n int64) int64

伪随机排列的切片

返回一个有n个元素的,[0,n)范围内整数的伪随机排列的切片

fmt.Println(rand.Perm(10)) // [3 7 0 1 9 2 4 5 6 8]

生成标准正态分布

返回一个服从标准正态分布(标准差=1,期望=0)

取值范围在[-math.MaxFloat64, +math.MaxFloat64]的float64值。

fmt.Println(rand.NormFloat64())
//生成不同的正态分布值
fmt.Println(rand.NormFloat64() * 标准差 + 期望)

生成标准指数分布

返回一个服从标准指数分布(率参数=1,率参数是期望的倒数)

取值范围在(0, +math.MaxFloat64]的float64值。

fmt.Println(rand.ExpFloat64())
//生成不同的指数分布值
fmt.Println(rand.ExpFloat64() / 率参数)

到此这篇关于详解Go语言中rand(随机数)包的使用的文章就介绍到这了,更多相关Go语言 rand包内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go字典使用详解

    Go字典使用详解

    今天和大家一起学习Go语言的字典。Go语言的字典又称为map,一种使用广泛的数据结构。它是拥有key/value对元素的「无序集合」,而且在集合中key必须是唯一的
    2022-11-11
  • Linux环境下编译并运行go项目的全过程

    Linux环境下编译并运行go项目的全过程

    Go语言是Google的开源编程语言,广泛应用于云计算、分布式系统开发等领域,在Linux上也有大量的应用场景,这篇文章主要给大家介绍了关于Linux环境下编译并运行go项目的相关资料,需要的朋友可以参考下
    2023-11-11
  • Go cobra库使用教程

    Go cobra库使用教程

    cobra既是一个用于创建强大现代CLI应用程序的库,也是一个生成应用程序和命令文件的程序。cobra被用在很多go语言的项目中,比如 Kubernetes、Docker、Istio、ETCD、Hugo、Github CLI等等
    2022-12-12
  • go语言获取系统盘符的方法

    go语言获取系统盘符的方法

    这篇文章主要介绍了go语言获取系统盘符的方法,涉及Go语言调用winapi获取系统硬件信息的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • Golang实现KV存储引擎实例探究

    Golang实现KV存储引擎实例探究

    这篇文章主要为大家介绍了Golang实现KV存储引擎实例探究,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • 举例讲解Go语言中函数的闭包使用

    举例讲解Go语言中函数的闭包使用

    这篇文章主要介绍了Go语言中函数的闭包使用示例,函数闭包closure是编程语言中十分重要的特性,需要的朋友可以参考下
    2016-03-03
  • Golang中互斥锁和读写互斥锁原理及示例代码

    Golang中互斥锁和读写互斥锁原理及示例代码

    在Golang中,互斥锁是一种基本的同步原语,用于实现对共享资源的互斥访问,读写互斥锁是一种特殊类型的互斥锁,它允许多个协程同时读取某个共享资源,本文将通过过示例代码详细介绍Golang中互斥锁和读写互斥锁,需要的朋友可以参考下
    2023-05-05
  • go下载指定版本的依赖包图文详解

    go下载指定版本的依赖包图文详解

    由于依赖包的每个版本都有一个唯一的目录,所以在多项目场景中需要使用同一个依赖包的多版本时才不会产生冲突,下面这篇文章主要给大家介绍了关于go下载指定版本的依赖包的相关资料,需要的朋友可以参考下
    2023-04-04
  • Golang创建构造函数的方法超详细讲解

    Golang创建构造函数的方法超详细讲解

    构造器一般面向对象语言的典型特性,用于初始化变量。Go语言没有任何具体构造器,但我们能使用该特性去初始化变量。本文介绍不同类型构造器的差异及其应用场景
    2023-01-01
  • Golang并发读取文件数据并写入数据库的项目实践

    Golang并发读取文件数据并写入数据库的项目实践

    本文主要介绍了Golang并发读取文件数据并写入数据库的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06

最新评论