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

目录
  • 包"math/rand"
  • 随机数种子
  • 随机函数
    • rand.Int()
    • rand.Intn(n)
  • 实例
  • 其他随机函数
    • 按类型随机类
    • 指定随机范围类
    • 伪随机排列的切片
    • 生成标准正态分布
    • 生成标准指数分布

包"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包内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • GoLang 中的随机数的示例代码

    随机数我们都知道,就是计算机通过某种算法,"随机"的生成一个数字.很多编程语言都有内置的方法来生成随机数,那么 GoLang 中是怎样一种情况呢? 伪随机数 我们都知道"随机数"在现实生活中的概念,可能你随手抛一个硬币,就可以说其结果是随机的,但是在计算机中要确定一个"随机数"真的是"随机数",那可是有标准的,不是你随随便便说是就是. 根据密码学原理,要想对一个"随机数"进行随机性检验有以下几个标准: 统计

  • 一文完全掌握 Go math/rand(源码解析)

    Go 获取随机数是开发中经常会用到的功能, 不过这个里面还是有一些坑存在的, 本文将完全剖析 Go math/rand, 让你轻松使用 Go Rand. 开篇一问: 你觉得 rand 会 panic 吗 ? 源码剖析 math/rand 源码其实很简单, 就两个比较重要的函数 func (rng *rngSource) Seed(seed int64) { rng.tap = 0 rng.feed = rngLen - rngTap //... x := int32(seed) for i :=

  • 利用Golang生成整数随机数方法示例

    php随机数 生成一个给定范围的随机数,用 PHP 就太简单不过了,而且可以指定从负数到正整数的范围,如: <?php echo mt_rand(-988, 888); 这样就随机生成 -988 到 888 的随机数. 使用 Go 就要稍微麻烦一点.以下两个函数分别是生成一个最大范围内随机整数,和生成一个区间范围的随机整数: 生成一个最大范围内随机数 一定要给一个时间戳的种子,否则每次生成都是一样的值.这里就是生成 [0,100) 的随机数. func GenerateRandnum() int

  • Go语言生成随机数的方法

    本文实例讲述了Go语言生成随机数的方法.分享给大家供大家参考.具体实现方法如下: golang生成随机数可以使用math/rand包 复制代码 代码如下: package main        import (     "fmt"     "math/rand" )        func main() {     for i:=0; i<10; i++ {         fmt.Println(rand.Intn(100))     } } 发现这种情况

  • golang 随机数的两种方式

    golang支持两种随机数生成方式: math/rand          // 伪随机 crypto/rand        // 真随机 math/rand伪随机生成的数字是确定的,不论在什么机器.什么时间,只要执行的随机代码一样,那么生成的随机数就一样.为了尽量随机性,那么我们可以每次使用不同的seed来启动程序,就可以保证每次启动都产生新的随机数,聪明的你肯定想到了使用时间戳 func main() { fmt.Println(rand.Intn(100)) //设置随机数种子,由于种子

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

    目录 包"math/rand" 随机数种子 随机函数 rand.Int() rand.Intn(n) 实例 其他随机函数 按类型随机类 指定随机范围类 伪随机排列的切片 生成标准正态分布 生成标准指数分布 包"math/rand" 随机数生成器,可以生成 整型或浮点型 的伪随机数. 随机数种子 不同的种子生成不同的随机数,无种子编译后运行的结果是定值. 通常以时钟作为参数初始化,rand.Seed(time.Now().UnixNano()). 随机函数 rand.

  • 详解C语言中rand函数的使用

    前言 我们在编程实现算法的过程中,往往需要使用到随机数.由于计算机是一台以逻辑为基础的机器,没法做到真正的随机(大概量子计算机可以?).所以计算机生成的是伪随机数,供我们使用. 我们使用C语言的rand函数,生成的也是伪随机数. c语言之rand函数的使用 1.写入头文件 #include <stdlib.h> #include <stdio.h> #include <time.h> 2.变量的定义 void main( void ) { int i,k; 3.sran

  • 详解R语言中的PCA分析与可视化

    1. 常用术语 (1)标准化(Scale) 如果不对数据进行scale处理,本身数值大的基因对主成分的贡献会大.如果关注的是变量的相对大小对样品分类的贡献,则应SCALE,以防数值高的变量导入的大方差引入的偏见.但是定标(scale)可能会有一些负面效果,因为定标后变量之间的权重就是变得相同.如果我们的变量中有噪音的话,我们就在无形中把噪音和信息的权重变得相同,但PCA本身无法区分信号和噪音.在这样的情形下,我们就不必做定标. (2)特征值 (eigen value) 特征值与特征向量均为矩阵分

  • 详解go语言中sort如何排序

    目录 sort包源码解读 前言 如何使用 基本数据类型切片的排序 自定义Less排序比较器 自定义数据结构的排序 分析下源码 不稳定排序 稳定排序 查找 Interface 总结 参考 sort 包源码解读 前言 我们的代码业务中很多地方需要我们自己进行排序操作,go 标准库中是提供了 sort 包是实现排序功能的,这里来看下生产级别的排序功能是如何实现的. go version go1.16.13 darwin/amd64 如何使用 先来看下 sort 提供的主要功能 对基本数据类型切片的排序

  • 详解Go语言中Goroutine退出机制的原理及使用

    目录 退出方式 进程/main函数退出 通过channel退出 通过context退出 通过Panic退出 等待自己退出 阻止goroutine退出的方法 通过sync.WaitGroup 通过channel 封装 总结 goroutine是Go语言提供的语言级别的轻量级线程,在我们需要使用并发时,我们只需要通过 go 关键字来开启 goroutine 即可.作为Go语言中的最大特色之一,goroutine在日常的工作学习中被大量使用着,但是对于它的调度处理,尤其是goroutine的退出时机和

  • 详解C语言中return与exit的区别

    详解C语言中return与exit的区别 1,exit用于在程序运行的过程中随时结束程序,exit的参数是返回给OS的.main函数结束时也会隐式地调用exit函数.exit函数运行时首先会执行由atexit()函数登记的函数,然后会做一些自身的清理工作,同时刷新所有输出流.关闭所有打开的流并且关闭通过标准I/O函数tmpfile()创建的临时文件.exit是结束一个进程,它将删除进程使用的内存空间,同时把错误信息返回父进程,而return是返回函数值并退出函数 2,return是语言级别的,它

  • 详解 Go 语言中 Map 类型和 Slice 类型的传递

    Map 类型 先看例子 m1: func main() { m := make(map[int]int) mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) { m[1] = 100 m[2] = 200 } 结果是 map[2:200 1:100] 我们再修改如下 m2: func main() { var m map[int]int mdMap(m) fmt.Println(m) } func mdMap(m map[int]int) {

  • 详解C语言中Char型指针数组与字符数组的区别

    详解C语言中Char型指针数组与字符数组的区别 1.char 类型的指针数组:每个元素都指向一个字符串,指向可以改变 char *name[3] = { "abc", "def", "gbk" }; for(int i = 0 ; i < strlen(name); i ++){ printf("%s\n", *(name+i)); //printf("%s\n", name[i]); } //指向改

  • 详解Go语言中for range的"坑"

    前言 Go 中的for range组合可以和方便的实现对一个数组或切片进行遍历,但是在某些情况下使用for range时很可能就会被"坑",下面用一段代码来模拟下: func main() { arr1 := []int{1, 2, 3} arr2 := make([]*int, len(arr1)) for i, v := range arr1 { arr2[i] = &v } for _, v := range arr2 { fmt.Println(*v) } } 代码解析

  • 详解Golang语言中的interface

    interface是一组method签名的组合,interface可以被任意对象实现,一个对象也可以实现多个interface.任意类型都实现了空interface(也就是包含0个method的interface),空interface可以存储任意类型的值.interface定义了一组方法,如果某个对象实现了某个接口的所有方法,则此对象就实现了此接口. go version go1.12 package main import ( "fmt" ) // 定义struct type Hu

随机推荐