mathx

package
v0.34.0 Latest Latest
Warning

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

Go to latest
Published: Nov 4, 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