在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. ucoreOS_lab3 实验报告

    所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...

  2. LeetCode——Employees Earning More Than Their Managers

    The Employee table holds all employees including their managers. Every employee has an Id, and there ...

  3. BeautyWe.js 一套专注于微信小程序的开发范式

    摘要: 小程序框架... 作者:JerryC 原文:BeautyWe.js 一套专注于微信小程序的开发范式 Fundebug经授权转载,版权归原作者所有. 官网:beautywejs.com Repo ...

  4. Mac启动MySQL

    启动MySQL服务 sudo /usr/local/Cellar/mysql//bin/mysql.server start 停止MySQL服务 sudo /usr/local/Cellar/mysq ...

  5. 通过优化Gunicorn配置获得更好的性能

    对于受CPU限制的应用程序,增加了工作程序和/或内核.对于受I / O限制的应用程序,请使用"伪线程". Gunicorn是Python WSGI HTTP Server,通常驻留 ...

  6. osi7层

  7. c# 第9节 数据类型之引用类型

    本节内容: 1:数据类型之引用类型 2:字符串要注意的两点: 1:数据类型之引用类型 实例: 2:字符串要注意的两点: 对变量进行重新赋值:其原本的字符串并没有销毁

  8. 201871010105-曹玉中《面向对象程序设计(java)》第十三周学习总结

    201871010105-曹玉中<面向对象程序设计(java)>第十三周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  9. MySQL数据库 外键,级联, 修改表的操作

    1.外键: 用来建立两张表之间的关系 - 一对多 - 多对多 - 一对一 研究表与表之间的关系: 1.定义一张 员工部门表 id, name, gender, dep_name, dep_desc - ...

  10. 如何做到MySQL的高可用?

    本课时的主题是“MySQL 高可用”,主要内容包含: 什么是高可用性 MySQL 如何提升 MTBF MySQL 如何降低 MTTR 避免单点失效 基础软硬件避免单点 MySQL 高可用架构选型 故障 ...