Documentation
¶
Overview ¶
Package mathx 提供常用的数学工具函数。
包含随机数生成、概率计算、浮点数精度处理等功能。
Index ¶
- func Clamp[T cmp.Ordered](v, lo, hi T) T
- func DivisionN(dividend, divisor float64, n int) float64
- func Floor(x float64, n int) float64
- func McNemarExact(n01, n10 int) float64
- func Probability(band []int) (index, r int)
- func ProbabilityElems(elems []float64, precise float64) []int
- func RandIntn(maxInt int) int
- func RangeRandFloat64(min, max float64) float64
- func Round(x float64, n int) float64
- func ToFixed(num float64, precise int) float64
- func WilsonCI(passed, total int, z float64) (lo, hi float64)
- type Unstable
- func (u Unstable) Around(n int) int
- func (u Unstable) AroundDuration(d time.Duration) time.Duration
- func (u Unstable) AroundFloat64(v float64) float64
- func (u Unstable) Upward(n int) int
- func (u Unstable) UpwardDuration(d time.Duration) time.Duration
- func (u Unstable) UpwardFloat64(v float64) float64
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func DivisionN ¶
DivisionN 执行除法并保留 n 位小数(截断,非四舍五入)。
截断用 math.Trunc 而非 int64 转换:int64(x) 在 x 超出 int64 范围时**回绕** (Go 规范未定义该情形,amd64/arm64 实测得到 -9223372036854775808)⇒ DivisionN(1e18, 1, 6) 实得 9.22e12(期望 1e18)。math.Trunc 同样向零截断, 但没有范围限制。
func McNemarExact ¶
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 ¶
Probability 根据累积概率边界返回随机选中的索引。 band 为空时返回 (0, 0)。
func ProbabilityElems ¶
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 RangeRandFloat64 ¶
RangeRandFloat64 返回 [min, max) 范围内的随机浮点数。
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
NewUnstable 创建抖动器。deviation 夹到 [0,1]:负值取 0,大于 1 取 1 (deviation>1 会让结果越过 0 甚至变号,对 TTL/数量类语义无意义)。
func (Unstable) Around ¶ added in v0.3.0
Around 返回 n ∈ [n(1-dev), n(1+dev)] 的随机整数。 deviation=0 恒等返回。适用于 TTL、数量等正数语义。
func (Unstable) AroundDuration ¶ added in v0.3.0
AroundDuration 返回 d ∈ [d(1-dev), d(1+dev)] 的随机时长。 deviation=0 恒等返回。
func (Unstable) AroundFloat64 ¶ added in v0.3.0
AroundFloat64 返回 v ∈ [v(1-dev), v(1+dev)] 的随机浮点数。 deviation=0 恒等返回。
func (Unstable) Upward ¶ added in v0.11.0
Upward 返回 n ∈ [n, n(1+dev)] 的随机整数:只向上抖动,适用于重试退避等 「不得比基准更早」的语义——对称抖动会把退避压短,退避叠加 jitter 反而 促成更密集的重试风暴。deviation=0 恒等返回。与 Around 一致,仅适用于 正数语义。
func (Unstable) UpwardDuration ¶ added in v0.11.0
UpwardDuration 返回 d ∈ [d, d(1+dev)] 的随机时长。deviation=0 恒等返回。
func (Unstable) UpwardFloat64 ¶ added in v0.11.0
UpwardFloat64 返回 v ∈ [v, v(1+dev)] 的随机浮点数。deviation=0 恒等返回。