Go Rand小结

  对于Random的使用,在业务中使用频率是非常高的,本文就小结下常用的方法:

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

一、"math/rand" 包实现了伪随机数生成器。也就是生成 整形和浮点型。

   该包中根据生成伪随机数是是否有种子(可以理解为初始化伪随机数),可以分为两类:

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

  2、无种子。可以理解为此时种子为1, Seek(1)。

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

// 1278610617 1508223627 2035989429 921556381 1472325922 1058000409 246974909 2131355695 160634752 1895791427 
// 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达到长度一致,如:

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {

  // 随机产生4位长度伪随机数
    for i := 0; i < 10; i++ {
        fmt.Printf("%.4d ", rand.Int31()%10000)
    }
}

// 8081 7887 1847 4059 2081 1318 4425 2540 0456 3300

二、”crypto/rand“ 包实现了用于加解密的更安全的随机数生成器。

  该包中常用的是 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]
时间: 2024-11-06 18:32:14

Go Rand小结的相关文章

Hive学习笔记(三)

分区和桶: hive把表组织成分区,这是一种根据分区列的值进行粗略划分的机制.使用分区可以加快数据分片的查询速度. 表或分区可以进一步划分为桶,它会为数据提供额外的数据结构从而获得更高效的查询处理.比如:根据用户ID来划分桶,我们可以在所有用户集合的随机样本上快速计算基于用户的查询. 分区: 分区是在创建表时用PARTITIONED BY子句进行定义.该子句需要定义列的列表. create table logs(ts String,line String ) PARTITIONED BY(dt

快速排序小结

快速排序小结 大纲: 1.快排的原理 2.最坏情况 3.优化快排的方法 4.一般写法与更好的写法 1.快排的原理(本文重点)          伪代码: Void sqsort(int left,int right){ 1.随便找个数aN 2.把要排序的数组分成以下 区间 <aN|<aN|<aN|-|==aN|==aN|==aN|-|>aN|>aN|>aN|-| 3.分别递归<aN与>aN的两个部分 If(left<最右边的<aN.sub) sq

算法导论6:排序小结和最值取法 2016.1.6

今天想做测试各个排序算法运行时间比较的程序,来对这几天学的排序算法小结一下.所以我先生成了1000000个1~150之间的随机数存到文件里.然后做了一个测试运行时间的程序.想看一下结构.但是结果效果并不太好.实践中,自己做的qsort函数和mergesort函数并没有理想中的那么快. 结果是这样:(可能并不准确,但却是是运行结果) 库函数快速排序:0.139000 seconds自制快速排序:0.375000 seconds归并排序:0.358000 seconds堆排序:0.525000 se

[MySQL优化案例]系列 — RAND()优化

众所周知,在MySQL中,如果直接 ORDER BY RAND() 的话,效率非常差,因为会多次执行.事实上,如果等值查询也是用 RAND() 的话也如此,我们先来看看下面这几个SQL的不同执行计划和执行耗时. 首先,看下建表DDL,这是一个没有显式自增主键的InnoDB表: [[email protected]]> show create table t_innodb_random\G *************************** 1. row *******************

Linux多线程编程小结

 Linux多线程编程小结 前一段时间由于开题的事情一直耽搁了我搞Linux的进度,搞的我之前学的东西都遗忘了,非常烦躁的说,如今抽个时间把之前所学的做个小节.文章内容主要总结于<Linux程序设计第3版>. 1.Linux进程与线程 Linux进程创建一个新线程时,线程将拥有自己的栈(由于线程有自己的局部变量),但与它的创建者共享全局变量.文件描写叙述符.信号句柄和当前文件夹状态. Linux通过fork创建子进程与创建线程之间是有差别的:fork创建出该进程的一份拷贝,这个新进程拥有自己的

各种排序算法小结和实现

各种排序算法想必大家都不陌生,定义我就不多介绍了,直接写下自己的一些小结. 快速排序:可以算的上应用最广的排序算法.其排序思路是随机选取一个数字作为标志,使得小于它的数在它左边,大于它的数在它的右边,然后递归对两边的数据排序. 归并排序:应用分之的思想,先将要排序的分为两列,然后分别进行排序,然后合并到另一 个数组中,最后再进行把它复制回来. 冒泡排序:是稳定排序,适用于排列的数组较小而且基本有序,否则时间复杂度太高. 选择排序:和冒泡排序差不多,差别是冒泡是相邻的比较,最后选出最大的或者最小的

经典排序方法及细节小结(1)

在数据结构的学习中,排序是我们要重点学习的一部分:在掌握几种经典排序算法的同时,我们还要能够根据实际中遇到的情况,结合它们的时间复杂度.空间复杂度.稳定性这几个方面选择最合适的算法.现针对常用的几种经典排序算法和容易出错的细节总结一下: 1.插入排序 (1)直接插入排序 直接插入排序是一种最简单的排序方法,其基本思路是: ①将一条记录插入到已排好的有序表中,从而得到一个大小加1的新有序表. ②每一步将一个待排序的数据元素,按其排序码的大小,插入到前面已经排好序的一组元素的合适位置上去 ③循环①②

各种基本算法实现小结(五)—— 排序算法

各种基本算法实现小结(五)-- 排序算法 (均已测试通过) * 选择排序 |____简单选择排序 |____堆排序 |____归并排序 * 交换排序 |____冒泡排序 |____快速排序 * 插入排序 |____直接插入排序 |____折半排序 |____希尔排序 * 分配排序 |____箱排序 |____基数排序 ====================================================================== 简单排序算法 1. 冒泡排序 测试环境

使用Apache POI导出Excel小结--导出XLS格式文档

使用Apache POI导出Excel小结 关于使用Apache POI导出Excel我大概会分三篇文章去写 使用Apache POI导出Excel小结--导出XLS格式文档 使用Apache POI导出Excel小结--导出XLSX格式文档 使用Apache POI导出Excel--大数量导出 导出XLS格式文档 做企业应用项目难免会有数据导出到Excel的需求,最近在使用其,并对导出Excel封装成工具类开放出来供大家参考.关于Apache POI Excel基本的概念与操作我在这里就不啰嗦