在Golang中,有两个包提供了rand,分别为 "math/rand" 和 "crypto/rand",  对应两种应用场景。

  • "math/rand" 包实现了伪随机数生成器。也就是生成 整形和浮点型。 该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:

    • 有种子。通常以时钟,输入输出等特殊节点作为参数,初始化。该类型生成的随机数相比无种子时重复概率较低。
    • 无种子。可以理解为此时种子为1, Seek(1)

golang 随机数有一个很有趣的地方,如果我们不自行定义随机数种子的话,每次生成的随机数都是一样的。golang 在默认随机的时候,固定以数字 1 作为种子。既然种子都固定了的话,那每次执行的结果当然是一样的。比如 第二个for 循环,打印 10 个随机数,每次运行结果是一模一样的。 

要解决这个问题,就需要以时间作为随机数种子。如第一个for循环:

package main

import (
"fmt"
"math/rand"
"time"
) func main() {
      //以时间为随机种子
for i := 0; i < 10; i++
r := rand.New(rand.NewSource(time.Now().UnixNano()))
fmt.Printf("%d ", r.Int31())
} fmt.Println(" ")
    //无种子,其实是固定以1为种子
for i := 0; i < 10; i++ {
fmt.Printf("%d ", rand.Int31())
}
}

  输出:

第一次运行结果

276310213 276310213 276310213 939632684 939632684 939632684 939632684 939632684 939632684 939632684

1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300

第二次运行结果

1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366 1101837366

1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300

第三次运行结果

483465292 483465292 483465292 483465292 1406725908 1406725908 1406725908 1406725908 1406725908 1406725908

1298498081 2019727887 1427131847 939984059 911902081 1474941318 140954425 336122540 208240456 646203300

 

常用的方法有:(以有种子的为例,无种子的直接通过 rand 调用对应的方法)

1> 按类型随机类:
func (r *Rand) Int() int
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值 2>指定随机范围类:
func (r *Rand) Intn(n int) int
func (r *Rand) Int31n(n int32) int32
func (r *Rand) Int63n(n int64) int64

 

拓展:对于需要随机指定位数的,当位数不够是,可以通过前边补0达到长度一致,如

package main
import (
"fmt"
"math/rand"
)
func main() {
// 随机产生6位长度伪随机数
for i := 0; i < 10; i++ {
fmt.Printf("%.6d ", rand.Int31()%1000000)
}
}

  输出

498081 727887 131847 984059 902081 941318 954425 122540 240456 203300

 

package main
import (
"fmt"
"math/rand"
"time"
)
func init() {
//以时间作为初始化种子
rand.Seed(time.Now().UnixNano())
}
func main() {
a := rand.Int()
fmt.Println(a)
b := rand.Intn(100)
fmt.Println(b)
c := rand.Float32()
fmt.Println(c)
}

  输出:

1910927962
45
0.9863281

  

”crypto/rand“ 包实现了用于加解密的更安全的随机数生成器:该包中常用的是 func Read(b []byte) (n int, err error) 这个方法, 将随机的byte值填充到b 数组中,以供b使用。示例如下:

package main

import (
"crypto/rand"
"fmt"
) func main() {
b := make([]byte, 20)
fmt.Println(b) // _, err := rand.Read(b)
if err != nil {
fmt.Println(err.Error())
} fmt.Println(b)
}

几点注意项:

1、如果不使用rand.Seed(seed int64),每次运行,得到的随机数会一样,程序不停止,一直获取的随机数是不一样的;

2、每次运行时rand.Seed(seed int64),seed的值要不一样,这样生成的随机数才会和上次运行时生成的随机数不一样;

3、rand.Intn(n int)得到的随机数int i,0 <= i < n。

  

golang学习笔记 ---rand的更多相关文章

  1. golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题

    golang学习笔记20 一道考察对并发多协程操作一个共享变量的面试题 下面这个程序运行的能num结果是什么? package main import ( "fmt" " ...

  2. golang学习笔记19 用Golang实现以太坊代币转账

    golang学习笔记19 用Golang实现以太坊代币转账 在以太坊区块链中,我们称代币为Token,是以太坊区块链中每个人都可以任意发行的数字资产.并且它必须是遵循erc20标准的,至于erc20标 ...

  3. golang学习笔记18 用go语言编写移动端sdk和app开发gomobile

    golang学习笔记18 用go语言编写移动端sdk和app开发gomobile gomobile的使用-用go语言编写移动端sdk和app开发https://blog.csdn.net/u01249 ...

  4. golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍

    golang学习笔记17 爬虫技术路线图,python,java,nodejs,go语言,scrapy主流框架介绍 go语言爬虫框架:gocolly/colly,goquery,colly,chrom ...

  5. golang学习笔记16 beego orm 数据库操作

    golang学习笔记16 beego orm 数据库操作 beego ORM 是一个强大的 Go 语言 ORM 框架.她的灵感主要来自 Django ORM 和 SQLAlchemy. 目前该框架仍处 ...

  6. golang学习笔记14 golang substring 截取字符串

    golang学习笔记14 golang substring 截取字符串golang 没有java那样的substring函数,但支持直接根据 index 截取字符串mystr := "hel ...

  7. golang学习笔记13 Golang 类型转换整理 go语言string、int、int64、float64、complex 互相转换

    golang学习笔记13 Golang 类型转换整理 go语言string.int.int64.float64.complex 互相转换 #string到intint,err:=strconv.Ato ...

  8. golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题

    golang学习笔记12 beego table name `xxx` repeat register, must be unique 错误问题 今天测试了重新建一个项目生成新的表,然后复制到旧的项目 ...

  9. golang学习笔记11 golang要用jetbrain的golang这个IDE工具开发才好

    golang学习笔记11   golang要用jetbrain的golang这个IDE工具开发才好  jetbrain家的全套ide都很好用,一定要dark背景风格才装B   从File-->s ...

随机推荐

  1. 英语JASPERITE碧玉Jasperite单词

    碧玉为一种含矿物质较多的和田玉,其中氧化铁和粘土矿物等含量可达20%以上,不透.微透或半透,颜色多呈暗红色.绿色或杂色. 中文名碧玉 外文名Jasper,Jasperite 别 称玛钠斯玉 类 别按颜 ...

  2. 通过MES技术居然可以防止制造数据造假?

    近些年来我们经历了太多制造数据造假事件,特别是前段时间曝出的医药制造事件更是将我们群众的愤怒值推到了最高点.不过我们最应当做的是,冷静下来,思考一下各行各业的我们是不是都该做些什么了?毕竟当下一个灾难 ...

  3. 简单聊聊实时视频rtmp

    背景: 由于经常接触实时视频, 对实时视频略有了解. 实时视频是将视频流实时上传到服务器端进行解析, 由RTMP服务器处理. RTMP 服务器 自己动手搭建一个rtmp, 本文在 Linux环境中搭建 ...

  4. 什么是唯品会JIT业务

    以销定采的模式,供应商将商品发给唯品会仓库在由唯品会发给客户:首先在唯品会创建档期绑定PO此时设置的商品库存为虚拟库存,之后供应商根据实际产生的有效订单将订单中的商品发给唯品会,最后再由唯品会发给用户 ...

  5. Spring Cloud Bus介绍--Spring Cloud学习第七天(非原创)

    一.什么是Spring Cloud Bus二.Spring Cloud Bus之RabbitMQ介绍三.Spring Cloud Bus整合RabbitMQ四.Spring Cloud Bus整合Ka ...

  6. 模仿51cto搜索框

    做这个demo遇见的问题 1==>input type=submit有默认样式 padding:1px 6px所以将他去除 2==>input submit有默认样式 去除默认边框 bor ...

  7. E05 【餐厅】What kind of coffee or tea would you like?

    核心句型 What  kind  of  coffee or tea would you like? 你想喝什么咖啡或者茶? What  would  you like? 你喜欢什么?/你想要什么? ...

  8. 201871010133 赵永军《面向对象程序设计(java)》第六、七周学习总结

    201871010133 赵永军<面向对象程序设计(java)>第六.七周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  9. USACO Cow Cars

    洛谷 P2909 [USACO08OPEN]牛的车Cow Cars https://www.luogu.org/problemnew/show/P2909 JDOJ 2584: USACO 2008 ...

  10. ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级

    实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...