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

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

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

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

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

 for i := ; i < ; i++ {
r := rand.New(rand.NewSource(time.Now().UnixNano()))
fmt.Printf("%d ", r.Int31())
} fmt.Println("")
for i := ; i < ; i++ {
fmt.Printf("%d ", rand.Int31())
} // 703626706 738454556 1582952585 1585378792 1337824049 728749578 2042459905 780929790 1910510343 178978546 // 1106410694 1747278511 460128162 817455089 683024728 1006933274 607811211 629431445 1458323237 469339106

设定范围:

// int
func randInt(min int , max int) int {
return min + rand.Intn(max-min)
} // float
func randomFloat(min, max int) float64 {
if max == min {
return float64(max)
}
return decimal(rand.Float64()*(float64(max) - float64(min)) + float64(min))
} func decimal(v float64) float64 {
val, _ := strconv.ParseFloat(fmt.Sprintf("%.3f", v), )
return val
}

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

> 按类型随机类:
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值 >指定随机范围类:
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 := ; i < ; i++ {
fmt.Printf("%.4d ", rand.Int31()%)
}
} // 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, )
fmt.Println(b) // _, err := rand.Read(b)
if err != nil {
fmt.Println(err.Error())
} fmt.Println(b)
} import (
"crypto/rand"
"fmt"
) func main() {
b := make([]byte, )
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]
// [82 253 252 7 33 130 101 79 22 63 95 15 154 98 29 114 149 102 199 77]

golang-random随机数的更多相关文章

  1. string、math类、random随机数、datetime、异常保护

    今天讲的知识点比较多,比较杂,以至于现在脑子里还有点乱,慢慢来吧... string (1)string.length; (获得你string字符串的长度) (2)a = a.Trim(); 重新赋值 ...

  2. 2016年10月12日--string、Math类、Random随机数、DateTime、异常保护

    string string.length; //得到string长度 string.Trim(); //去掉string前后的空格 string.TrimStart(); //去掉string前的空格 ...

  3. 类:String,Math,DateTime,Random随机数,异常保护

    String类: 练习: Math类: Random随机数: DateTime类: 异常保护: 练习: 1. 2. 3.方法一: 方法二: 4.人机大战石头剪刀布 5. //请输入你想输入的数字 // ...

  4. 第四十七节,random 随机数模块

    random 随机数模块格式: import random 引入随机模块文件 random.randrange(65,91) 调用随机函数random.randrange(随机数开始范围,随机数结束范 ...

  5. random 随机数模块

    import random # 随机数模块 print(random.random()) #0-1 不包括1随机浮点数 print(random.randint(1,10)) # 1-10 包括1和1 ...

  6. os与操作系统进行交互,sys解释器相关,random随机数,shutil解压和压缩

    1.os 与操作系统相关 对文件的处理 对路径的处理 import os#主要用于与操作系统进行交互 掌握: print(os.makedirs('a/b/c'))#创建目录 可用递归创建 print ...

  7. Java基础三(Scanner键盘输入、Random随机数、流程控制语句)

    1.引用类型变量的创建及使用2.流程控制语句之选择语句3.流程控制语句之循环语句4.循环高级 ###01创建引用类型变量公式 * A: 创建引用类型变量公式 * a: 我们要学的Scanner类是属于 ...

  8. 常用类--Date日期类,SimpleDateFormat日期格式类,Calendar日历类,Math数学工具类,Random随机数类

    Date日期类 Date表示特定的时间,精确到毫秒; 构造方法: public Data() public Date(long date) 常用方法: public long getTime() pu ...

  9. 【转载】Javascript使用Math.random()随机数函数生成1至1000的随机数

    在Javascript代码编写过程中,有时候我们需要使用Js来生成随机数,清除ajax的get请求缓存的时候我们会带上一个随机数来解决此问题,此外在其他应用中也可能使用到随机数,在Javascript ...

  10. net Random 随机数重复的问题

    在实际项目中不仅需要随机产生密码字符串,还要一次生成多个.我把生成随机字符串的方法放到for循环中,问题出现了. 生成的字符串,会重复. 经过多方查证,原因在代码. //使用与系统时间相关的种子 Ra ...

随机推荐

  1. 基于docker搭建wordpress博客网站平台

    WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...

  2. ios多线程之NSOperation

    使用 NSOperation的方式有两种, 一种是用定义好的两个子类: NSInvocationOperation 和 NSBlockOperation. 另一种是继承NSOperation 如果你也 ...

  3. APIO2019&&THUSC2019游记

    APIO2019懵十三记: day0: 早上和ljx从沈阳出发,下午一点到的首师大附. 由于工作人员中午十二点就散了,我们就先去试机了. 下午三点接到狗牌和T恤,晚上买麦当劳回如意吃. 晚上还有场模拟 ...

  4. (23)zabbix单位符号Unit symbols

    概述 在zabbix里面,我们不需要使用大数字来,例如我们可以不使用86400来表示一天,这个数字又不容易理解也容易出错.用什么办法来解决大数字问题呢?我们可以使用单位来简化,例如简化zabbix触发 ...

  5. Linux 永久修改主机名hostname

    前言: 由于最近用3台机器,经常切换导致有容易区别的需求. 故想修改主机名. 实验环境:Ubuntu 17 教程: 1. 使用hostname 命令先临时修改 sudo hostname your_n ...

  6. Linux菜鸟起飞之路【三】Linux常用命令

    一.Linux命令的基本格式 命令 [选项] [参数] a)命令:就是告诉操作系统要做什么 b)选项:说明命令的运行方式,有的会改变命令的功能,选项通常以“-”开始 c)参数:说明命令的操作对象,如文 ...

  7. linux终端颜色控制

    引言: 由于在c代码中看到过打印彩色字, 又对PS1 想进一步了解,才有了这篇博文.----------------------------------------Linux 终端控制台字体颜色  - ...

  8. 【HIHOCODER 1529】 不上升序列

    描述 给定一个长度为 n 的非负整数序列 a[1..n]. 你每次可以花费 1 的代价给某个 a[i] 加1或者减1. 求最少需要多少代价能将这个序列变成一个不上升序列. 输入 第一行一个正整数 n. ...

  9. python中strip(),lstrip(),rstrip()函数的讲解

    1. strip() 它的函数原型:string.strip(s[, chars]),它返回的是字符串的副本,并删除前导和后缀字符.(意思就是你想去掉字符串里面的哪些字符,那么你就把这些字符当参数传入 ...

  10. win10系统中virtualbox无法安装64位系统

    win10系统中virtualbox无法安装64位系统 先总结下如果想在虚拟机中安装64位的Linux系统,最好能满足这几个条件: 64位CPU 64位操作系统 64位的虚拟机软件 开启BIOS虚拟化 ...