Help us shape the future of Go! Take the 2026 Go Developer Survey

mathx

package
v0.30.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Oct 28, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Overview

Package mathx 提供常用的数学工具函数。

包含随机数生成、概率计算、浮点数精度处理等功能。

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Clamp

func Clamp[T cmp.Ordered](v, lo, hi T) T

Clamp 将 v 限制在 [lo, hi] 范围内。 支持 int、float、string 等所有实现了 cmp.Ordered 的类型。

func DivisionN

func DivisionN(dividend, divisor float64, n int) float64

DivisionN 执行除法并保留 n 位小数(截断,非四舍五入)。

截断用 math.Trunc 而非 int64 转换:int64(x) 在 x 超出 int64 范围时**回绕** (Go 规范未定义该情形,amd64/arm64 实测得到 -9223372036854775808)⇒ DivisionN(1e18, 1, 6) 实得 9.22e12(期望 1e18)。math.Trunc 同样向零截断, 但没有范围限制。

func Floor

func Floor(x float64, n int) float64

Floor 对 float64 向下取整,保留 n 位小数。

func McNemarExact

func McNemarExact(n01, n10 int) float64

McNemarExact McNemar 精确检验(双侧):n01=甲败乙过数,n10=甲过乙败数。 返回 p 值;n01+n10=0(无任何翻转)返回 1(无差异);p 钳到 1。

负数计数按 0 处理(调用方不该给出负计数,但本函数不返回 error, 不能让一个非法计数把结果变成「显著」)。

大 n 不再溢出:直接累加组合数 C(n,i) 会溢出(实测 C(1200,600) ≈ 1e360 > float64 上限)⇒ 累加和与 2^n 同时成 +Inf ⇒ Inf/Inf = NaN ⇒ 返回 NaN (实测 McNemarExact(600,600))。改在**相对权重**空间递推(见 binomHalfTail),全程不产生大数。

func Probability

func Probability(band []int) (index, r int)

Probability 根据累积概率边界返回随机选中的索引。 band 为空时返回 (0, 0)。

func ProbabilityElems

func ProbabilityElems(elems []float64, precise float64) []int

ProbabilityElems 计算概率分布的累积边界(按**调用方给定的顺序**)。

elems 是概率值切片(所有权重必须 > 0 且有限),precise 是精度基数(>= 1)。 返回的 band 满足:band[i] 是 elems[0..i] 的权重累计(单位化后)⇒ 与 elems **同序**,Probability 返回的下标可直接用于索引 elems。

⚠️ 此前本函数内部排序(排序副本)后**丢弃了置换关系** ⇒ 返回的 band 对应的 是**排序后**的顺序,而 Probability 返回的是那个顺序里的下标 ⇒ 调用方拿它 索引自己的 elems 会选错元素(权重被静默置换)。实测 elems=[0.6,0.1,0.3] 得到 band=[10,40,100](对应排序后的 [0.1,0.3,0.6]):下标 0 实际指向权重 0.6 的元素、却只分到了 0.1 的份额。

存在 0/负权重、precise < 1 时直接 panic:这两种输入都会让 band 静默退化为 全 0,Probability 恒选 index 0——概率路由静默出错比快速失败更危险。 (precise < 1 时 10^ceil(log10(precise/minW)) < 1/minW ⇒ 最小权重分不到 任何一个单位 ⇒ band[0] == 0。)

func RandIntn

func RandIntn(maxInt int) int

RandIntn 返回 [0, maxInt) 范围内的随机整数。 并发安全,使用包级 rng 避免同纳秒碰撞。

func RangeRandFloat64

func RangeRandFloat64(min, max float64) float64

RangeRandFloat64 返回 [min, max) 范围内的随机浮点数。

func Round

func Round(x float64, n int) float64

Round 对 float64 进行四舍五入,保留 n 位小数。

func ToFixed

func ToFixed(num float64, precise int) float64

ToFixed 将 float64 格式化为指定小数位数。

func WilsonCI

func WilsonCI(passed, total int, z float64) (lo, hi float64)

WilsonCI 通过率的 Wilson 得分置信区间(小样本下比正态近似诚实)。 返回 (lo, hi);total<=0 时返回 (0,0);结果钳到 [0,1]。

计数越界(passed<0 或 passed>total)按钳到 [0,total] 处理:越界会让 p 落到 [0,1] 之外 ⇒ p*(1-p)<0 ⇒ math.Sqrt(负数)=NaN ⇒ 返回 (NaN,NaN) (实测 WilsonCI(5,3,1.96))。钳到合法区间后区间才有意义。

Types

type Unstable added in v0.3.0

type Unstable struct {
	// contains filtered or unexported fields
}

Unstable 围绕基准值产生比例随机抖动:Around 对称 ±deviation (典型用途是打散缓存 TTL:同批写入的 key 若 TTL 完全一致,会形成周期性 的集中失效(缓存雪崩),用抖动值错开即可缓解);Upward 单边向上 (重试退避「不得比基准更早」语义)。

u := mathx.NewUnstable(0.1)
ttl := u.AroundDuration(30 * time.Minute) // ∈ [27min, 33min]

零值不可直接使用,经 NewUnstable 创建(deviation 夹到 [0,1])。

func NewUnstable added in v0.3.0

func NewUnstable(deviation float64) Unstable

NewUnstable 创建抖动器。deviation 夹到 [0,1]:负值取 0,大于 1 取 1 (deviation>1 会让结果越过 0 甚至变号,对 TTL/数量类语义无意义)。

func (Unstable) Around added in v0.3.0

func (u Unstable) Around(n int) int

Around 返回 n ∈ [n(1-dev), n(1+dev)] 的随机整数。 deviation=0 恒等返回。适用于 TTL、数量等正数语义。

func (Unstable) AroundDuration added in v0.3.0

func (u Unstable) AroundDuration(d time.Duration) time.Duration

AroundDuration 返回 d ∈ [d(1-dev), d(1+dev)] 的随机时长。 deviation=0 恒等返回。

func (Unstable) AroundFloat64 added in v0.3.0

func (u Unstable) AroundFloat64(v float64) float64

AroundFloat64 返回 v ∈ [v(1-dev), v(1+dev)] 的随机浮点数。 deviation=0 恒等返回。

func (Unstable) Upward added in v0.11.0

func (u Unstable) Upward(n int) int

Upward 返回 n ∈ [n, n(1+dev)] 的随机整数:只向上抖动,适用于重试退避等 「不得比基准更早」的语义——对称抖动会把退避压短,退避叠加 jitter 反而 促成更密集的重试风暴。deviation=0 恒等返回。与 Around 一致,仅适用于 正数语义。

func (Unstable) UpwardDuration added in v0.11.0

func (u Unstable) UpwardDuration(d time.Duration) time.Duration

UpwardDuration 返回 d ∈ [d, d(1+dev)] 的随机时长。deviation=0 恒等返回。

func (Unstable) UpwardFloat64 added in v0.11.0

func (u Unstable) UpwardFloat64(v float64) float64

UpwardFloat64 返回 v ∈ [v, v(1+dev)] 的随机浮点数。deviation=0 恒等返回。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL