go math/rand

package rand

import "math/rand"

rand包实现了伪随机数生成器。

math_rand go官方标准文档

随机数从资源生成。包水平的函数都使用的默认的公共资源。该资源会在程序每次运行时都产生确定的序列。如果需要每次运行产生不同的序列,应使用Seed函数进行初始化。默认资源可以安全的用于多go线程并发。

在go中生成随机数需要一个结构体实例 Rand ,要构建这个结构体需要一些参数;为了便捷,go已经在math/rand包中定义好了一个Rand结构体实例,只需要调用Rand的一些方法就可以生成各种随机数来。下面简单认识一下Rand结构体:

type Rand struct {
src Source
s64 Source64 // 如果src为空,则为64 // readVal包含用于字节的63位整数的remainer,在最近的读取调用期间生成。
// 它被保存,以便下一个读调用可以从上一个读调用结束的地方开始。
readVal int64 // readPos表示仍然有效的readVal的低位字节数。
readPos int8
}

简单示例:

package main

import (
"fmt"
"math/rand"
) func main() {
// 调用rand的方法生成伪随机int值
fmt.Println(rand.Int())
fmt.Println(rand.Int31())
fmt.Println(rand.Intn(5))
}

运行结果:

5577006791947779410
2019727887
2

当代码运行多次发现时,结果都是一样的。不管怎么运行代码,产生的结果都是这三个数,不会变。为什么?这是因为我们还没有设置随机数种子。

rand.Seed 设置随机数种子

func (r *Rand) Seed(seed int64) 使用给定的seed来初始化生成器到一个确定的状态。

修改后的代码:

package main

import (
"fmt"
"math/rand"
"time"
) func main() {
rand.Seed(time.Now().UnixNano()) // 取纳秒时间戳,可以保证每次的随机数种子都不同
fmt.Println(rand.Int())
fmt.Println(rand.Int31())
fmt.Println(rand.Intn(5))
}

代码多次运行,就会发现每次结果是不一样的

7684945739848266880
1210528256
4
-------------------
4700552700982711365
1927716820
4

自定义生成Rand结构体,设置随机数种子

除了上面生成伪随机数的方法,我们还可以自定义生成Rand结构体,本质上与Rand提供好的结构体没有太大区别,下面简单介绍下自己声明Rand结构体,来生成伪随机数:

func NewSource(seed int64) Source

使用给定的种子创建一个伪随机资源。

func New(src Source) *Rand

返回一个使用src生产的随机数来生成其他各种分布的随机数值的*Rand。

代码示例:

package main

import (
"fmt"
"math/rand"
"time"
) func main() {
source := rand.NewSource(time.Now().UnixNano()) // 使用当前的纳秒生成一个随机源,也就是随机种子
ran := rand.New(source) // 生成一个rand
fmt.Println(rand.Int())
fmt.Println(rand.Int31())
fmt.Println(rand.Intn(5))
}

这两种方法本质上没有区别,NewSource()方法等价于前面的rand.Seed()方法,都是用来设置随机种子。

其它生成随机数的方法

Rand生成随机数当然不只这三个方法,还有其它生成随机数的方法

func (r *Rand) Int63() int64

返回一个int64类型的非负的63位伪随机数。

func (r *Rand) Uint32() uint32

返回一个uint32类型的非负的32位伪随机数。

func Int31n(n int32) int32

返回一个取值范围在[0,n)的伪随机int32值,如果n<=0会panic。

func Int63n(n int64) int64

返回一个取值范围在[0, n)的伪随机int64值,如果n<=0会panic。

func (r *Rand) Float32() float32

返回一个取值范围在[0.0, 1.0)的伪随机float32值。

func (r *Rand) Float64() float64

返回一个取值范围在[0.0, 1.0)的伪随机float64值。

func (r *Rand) Perm(n int) []int

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

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() {
for i := 0; i < 10; i++ {
fmt.Printf("%.4d ", rand.Int31()%10000)
}
}

运行结果:

8081 7887 1847 4059 2081 1318 4425 2540 0456 3300

go crypto/rand

package rand

import "crypto/rand"

rand包实现了用于加解密的更安全的随机数生成器,主要应用场景:生成随机加密串

crypto_rand go官方标准文档

主要方法

(1)func Int(rand io.Reader, max *big.Int) (n *big.Int, err error)

返回一个在[0, max)区间服从均匀分布的随机值,如果max<=0则会panic

(2)func Prime(rand io.Reader, bits int) (p *big.Int, err error)

返回一个具有指定字位数(二进制的位数)的数字,该数字具有很高可能性是质数。如果从rand读取时出错,或者bits<2会返回错误

(3)func Read(b []byte) (n int, err error)

本函数是一个使用io.ReadFull调用Reader.Read的辅助性函数。当且仅当err == nil时,返回值n == len(b)

代码示例:

package main

import (
"crypto/rand"
"encoding/base64"
"fmt"
"math/big"
) func main() {
//1、Int
n, err := rand.Int(rand.Reader, big.NewInt(128))
if err == nil {
fmt.Println("rand.Int:", n, n.BitLen())
}
//2、Prime
p, err := rand.Prime(rand.Reader, 5)
if err == nil {
fmt.Println("rand.Prime:", p)
}
//3、Read
b := make([]byte, 32)
m, err := rand.Read(b)
if err == nil {
fmt.Println("rand.Read:", b[:m])
fmt.Println("rand.Read:", base64.URLEncoding.EncodeToString(b))
}
}

运行结果:

    rand.Int: 92 7
rand.Prime: 29
rand.Read: [207 47 241 208 190 84 109 134 86 106 87 223 111 113 203 155 44 118 71 20 186 62 66 130 244 98 97 184 8 179 6 230]
rand.Read: zy_x0L5UbYZWalffb3HLmyx2RxS6PkKC9GJhuAizBuY=

常用的是 func Read(b []byte) (n int, err error) 这个方法, 将随机的byte值填充到b 数组中,以供b使用。示例如下:

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)
}

运行结果:

[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]
[68 221 145 73 115 224 13 110 218 130 19 139 38 170 145 58 251 188 126 197]

go math/rand包详解的更多相关文章

  1. 常见 jar包详解

        常见 jar包详解 jar包 用途 axis.jar SOAP引擎包 commons-discovery-0.2.jar 用来发现.查找和实现可插入式接口,提供一些一般类实例化.单件的生命周期 ...

  2. Java.lang 包 util 包等各个包详解

    java.lang 该包提供了 Java 编程的基础类,例如 Object.Math.String.StringBuffer.System.Thread 等,不使用该包就很难编写 Java 代码了. ...

  3. Spring jar包详解

    Spring jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spri ...

  4. Spring——jar包详解(转)

    Spring——jar包详解 org.springframework.aop ——Spring的面向切面编程,提供AOP(面向切面编程)的实现 org.springframework.asm——spr ...

  5. Spring 3.x jar 包详解 与 依赖关系

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  6. Spring 3.x jar 包详解 与 依赖关系(转)

    以下的内容我会持续更新(当然是我有新发现的时候); 以下内容是我在网上搜索.整理.修改的而成的内容.由于很多内容都是转载了,无法追溯到源头,因此无法一一对原作者进行道谢. 这几天,我查阅大量的官方的文 ...

  7. 2.TCP_IP互联线缆_TCP_UDP报文抓包详解

    TCP_IP互联线缆_TCP_UDP报文抓包详解 2.1网线标准 直通线 交叉线 异种设备互联使用直通线 同种设备互联使用交叉线 TCP和UDP 端口寻址 TCP数据格式 TCP三次握手 UDP数据格 ...

  8. TCP通讯处理粘包详解

    TCP通讯处理粘包详解 一般所谓的TCP粘包是在一次接收数据不能完全地体现一个完整的消息数据.TCP通讯为何存在粘包呢?主要原因是TCP是以流的方式来处理数据,再加上网络上MTU的往往小于在应用处理的 ...

  9. easyui下载包详解

    easyui包详解: 文件夹: demo--该目录下存放的是 EasyUI PC 版各插件的示例示例.如果不想在官网上查看演示,可以在该目录下找到相应的演示示例 demo-mobile--该目录下存放 ...

  10. spring原理案例-基本项目搭建 02 spring jar包详解 spring jar包的用途

    Spring4 Jar包详解 SpringJava Spring AOP: Spring的面向切面编程,提供AOP(面向切面编程)的实现 Spring Aspects: Spring提供的对Aspec ...

随机推荐

  1. 前后端分离模式下Java Web开发中的技术栈概图

    参考链接1:前后端的分离模式 参考链接2:浅谈前后端分离开发模式 参考链接3:前后端分离开发模式介绍

  2. SQL优化——深分页&排序

    问题背景 在开发 Web 应用或处理数据库查询时,分页是一项常见需求.然而,当面对深度分页(即页码较大,偏移量较高的分页情况)时,性能问题往往接踵而至.比如对一些需要拉特定的页面查询.范围导出.范围计 ...

  3. Note - 两类容斥

    \(\S1.\) 等价容斥   (乱取的名字.)   题目将组合对象构成的 "等价类" 进行了定义和限定. 我们往往无法计数 "等价类真的长这样" 的方案, 而 ...

  4. uwp IProgress<T>进度通知。

    主要是利用 Pp_ProgressChanged 报告进度: private void BtnDownload_Click(object sender, RoutedEventArgs e) { va ...

  5. Java虚拟机调优-基本垃圾回收算法

    背景: 可以从不同的的角度去划分垃圾回收算法: 按照基本回收策略分 引用计数(Reference Counting): 比较古老的回收算法.原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一 ...

  6. biancheng-Java设计模式:23种设计模式全面解析(超级详细)

    http://c.biancheng.net/design_pattern/ 24种设计模式 1.创建型模式 抽象工厂模式(Abstract factory pattern): 提供一个接口, 用于创 ...

  7. Paillier算法

    介绍 1999年欧密会上,首次提出Paillier算法,2001年,Damgard等人对该方案简化,推出当前最优的Paillier方案. 加密方案 Carmichael函数 困难问题 合数剩余类问题( ...

  8. MongoDB:使用场景简介

  9. WinForm实现无边框窗体的拖动

    一个登录窗体,FormBorderStyle属性设置为None,打开后不能挪动位置,有时候会妨碍使用,有点恶心.网上找了段内容,实现拖动效果: #region 无边框拖动效果,Form被Picture ...

  10. 一体机场景ceph高可用介绍

    本文分享自天翼云开发者社区<一体机场景ceph高可用介绍>,作者:b****n 一体机场景使用ceph开源架构作为存储系统的主体架构,原生方案支持存储数据高可用性,包括副本数可以灵活控制/ ...