伪随机数生成器,默认情况下随机数种子是固定的,

注意:固定的随机数种子每次生成的随机数都是相同的随机数序列

一、基础用法

math/rand 包提供了随机数生成的方法。常用的函数包括:

  • rand.Int():返回一个伪随机整数
  • rand.Float64():返回一个伪随机浮点数,范围是 [0.0, 1.0)
  • rand.Intn(n):返回一个伪随机整数,范围是 [0, n)

二、随机种子

默认情况下math/rand使用一个固定的种子值,会生成相同的随机数序列,生成不同的随机数序列需要设置一个动态的随机数种子,例如当前使用时间。

1. rand.seed()

初始化默认的全局随机数生成器

作用范围:修改全局随机数生成器的种子

优点:简单直接

缺点:不适用于多线程(全局状态会被竞争)

package main

import (
"fmt"
"math/rand"
"time"
) func main() {
// 使用当前时间戳设置种子,纳秒级
rand.Seed(time.Now().UnixNano()) // 生成随机数
fmt.Println("Random Int:", rand.Int())
fmt.Println("Random Intn(10):", rand.Intn(10))
}

2. rand.NewSource()

创建一个新的随机数生成器源(Source),通过 rand.New 基于此 Source创建一个独立的随机数生成器

优点:线程安全,可创建多个独立生成器

缺点:需要额外配置

使用年月日就可以设置/当年/当月/当天生成相同的随机数值,比如:

package main

import (
"fmt"
"math/rand"
"time"
) func main() {
seed := int64(time.Now().Day())
source := rand.NewSource(seed)
r := rand.New(source)
num := r.Int63n(100)
fmt.Println("随机整数:", num)
}

由此还可以演变出组合比如:把时分秒按照固定比率放大累加后就可设置当前时间或者分钟内生成相同的随机数序列

3. 注意

生成的随机数如果随机数种子设置的类似,他的图形波动曲线会类似,设置可能会无限趋近于一条直线

go的math/rand随机数生成器的更多相关文章

  1. golang之math/rand随机数

    简单的随机数生成,结合时间模块初始化种子 package main import ( "fmt" "math/rand" "time" ) ...

  2. golang——随机数(math/rand包与crypto/rand包)

    1.math/rand 包 1.1.math/rand 包实现了伪随机数生成器 1.2.主要方法 (1)func Seed(seed int64) 设置随机种子,不设置则默认Seed(1) (2)fu ...

  3. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  4. 开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

    原文:[原创]开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器                本博客所有文章分类的总目录:http://www.cnblogs.com/asxiny ...

  5. Go语言基础之rand(随机数)包

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

  6. [BZOJ3671][UOJ#6][NOI2014]随机数生成器

    [BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...

  7. NOI2014 随机数生成器

    随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...

  8. Linux下对拍脚本与随机数生成器

    对拍脚本 新建一个文档 check.sh 作为对拍脚本. #!/bin/bash while(true)do #死循环 ./data > .in #运行数据生成器,将数据输出到1.in ./st ...

  9. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

  10. java随机数生成器

    一.java.lang.Math.Random 调用这个Math.Random()函数能够返回带正号的double值,取值范围是[0.0,1.0)的左闭右开区间,并在该范围内(近似)均匀分布. 二.j ...

随机推荐

  1. MySQL原理简介—2.InnoDB架构原理和执行流程

    大纲 1.更新语句在MySQL中是如何执行的 2.重要的内存结构-Buffer Pool缓冲池 3.undo日志文件如何让更新的数据可以回滚 4.更新Buffer Pool缓冲池中的缓存数据 5.Re ...

  2. 推荐给初级Java程序员的3本进阶书

    ImportNew 注: 原作者在这篇文章中介绍3本不错的技术书籍.作者认为这些书籍对新手或者学生而言尤其有帮助.通过一些基础性的教程入门后,我们可以使用Java做基础性的编程.然而,当我们需要从初级 ...

  3. 使用certbot申请免费SSL证书

    现在网站使用https已经成为标配,但是SSL证书最便宜的DV证书也要几百块钱一年,对于个人开发者来说很不划算.好在,我们有Let's Encrypt,它是能提供免费的SSL证书,应该也是市面上使用最 ...

  4. Linux C/C++编程之静态库

    [图书推荐]<Linux C与C++一线开发实践(第2版)>_linux c与c++一线开发实践pdf-CSDN博客 <Linux C与C++一线开发实践(第2版)(Linux技术丛 ...

  5. Echarts 基本使用

    1.Echarts简介 ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求. ECharts 包含了以下特性: (1)丰富的可视化类型: 常规的折线图. ...

  6. Java 动态设置 JVM 参数的方法

    Java虚拟机(JVM)在运行Java应用时,其性能调优和资源管理至关重要.虽然许多JVM参数在启动时通过命令行设置,但在应用运行期间动态调整某些参数也是可行的.通过动态设置JVM参数,开发者可以更有 ...

  7. Flex 弹性布局备忘录

    概述 Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性 这也是我目前用的最多的一种布局方案,相比Grid布局此种布局方案相对较简单, ...

  8. COSBrowser iOS 版 | 如何不打开 App 查看监控数据?

    您是否有遇到这样的场景?当需要实时查看存储监控数据.查看某个存储桶的对象数量,又或者想了解某一个存储类型文件的下载量在当前与前一天的对比情况,是上涨了还是下降了,这时您是否也在经历频繁的打开关闭 Ap ...

  9. 运筹帷幄,质效兼修:源启云原生基础设施管理平台助推企业IT基础资源能效跃迁

    导语 数字化大潮席卷,企业需要建设一套能够满足云原生环境下基础资源一体化管理和快速交付的基础设施自动化管理系统,系统需要具备"云上""云下""容器&q ...

  10. 如何使用特定的SSH Key提交GIT

    问题提出 最近在自己的MAC上面提交Github代码的时候发现居然失败了: $ git push origin master Permission denied (publickey). fatal: ...