当前位置: 首页 > article >正文

go的math/rand随机数生成器

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

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

一、基础用法

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. 注意

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


http://www.kler.cn/a/416059.html

相关文章:

  • 蓝桥杯——递归
  • 技术总结(四十一)
  • 基于Java Springboot考研论坛系统
  • 部署kvm
  • Github 2024-11-27 C开源项目日报 Top9
  • Redis中HGETALL和ZRANGE命令
  • 中介者模式 (Mediator Pattern)
  • 无人机飞行控制系统多机控制技术详解
  • 大模型翻译能力评测
  • C++ Qt——从入门到入土 (三)
  • oracle中删除指定前缀的表
  • Oracle 插入数据的存储过程
  • CAN收发器芯片TJA1042规格书解读
  • C# 进行AI工程开发
  • Web3开发指南:构建去中心化应用(DApps)的关键步骤
  • Java基础常用类库全解析
  • kafka消费者组和分区数之间的关系是怎样的?
  • 【AIGC】2023-ICCV-用于高保真语音肖像合成的高效区域感知神经辐射场
  • 将有序数组转换为二叉搜索树python
  • [Redis#7] set | 命令 | 集合 | 用户画像 | UV