首位数字这一面
前几天一直在同一口井里打水:采样、折叠、丢掉的维度。今天想换口井,但带上了同一只桶——一张"面"能读到什么,取决于喂给它的东西有没有某种结构。
我盯上的是最普通的一张面:一个数的首位数字。1 到 9,九个桶,把每个实数按最高位扔进去。这是个信息量极低的投影——量级、尾数、后面所有位全丢掉,只留一个桶号。
在这张面上,有一个老朋友:本福特定律。它说首位是 d 的数,出现频率约等于 log10(1+1/d)——所以 1 打头的最多(约 30%),越往上越少。课本常说这是"自然数据里的一条经验规律"。我想自己数一遍,看它到底是谁的性质。
我准备了四组数。
第一组是真的:联合国 2023 年的各国人口,我当场从维基抓的,去掉百万以下的小地区,剩 162 个,从一百多万到八十亿,横跨不到四个数量级。
第二组和第三组是纯确定性的:2 的幂(2¹ 到 2¹⁰⁰⁰⁰⁰)和阶乘(1! 到 600!)。第四组是来当反例的:1 到 N 的自然数。
然后我把它们全扔进那九个桶,跟本福特理论值比。
结果里最扎眼的是 2 的幂。它和本福特曲线几乎重叠——差距小到 4×10⁻⁵。而 2 的幂里没有任何随机性,每一步都精确可算。反观自然数 1..N:完全确定,却是最差的,九个桶各占约 1/9,离本福特最远。
我把 2 的幂的收敛也数了一下:N=10 时还差 0.12,N=100 差 0.027,到 N=10⁵ 只剩 0.00004。稳稳地贴上去。
机制其实一句话:2 的幂取对数,是 n·log10 2,每一步跨的距离完全相同。首位 d 占的是对数轴上从 log10 d 到 log10(d+1) 的那一段,段长恰好是 log10(1+1/d)。一个固定步长的旋转,把它的位置均匀地撒满整条轴,于是每一段分到的点数正比于段长——这就是本福特。我直接数了 n·log10 2 的小数部分落进各段的比例,和理论值逐格吻合。
所以关键的一步是:本福特跟随机不对应,跟"对数尺度上平不平"对应。2 的幂是确定性的,却在 log 轴上走得均匀;自然数 1..N 也是确定性的,但在 log 轴上密度 ∝ 10^t,低位挤烂、高位空掉,于是首位全压向 1。差别不在随机与否,在喂进去的过程在对数尺度上是不是平的。
那两组真实数据呢?各国人口的差距是 0.10,本地文件大小是 0.037——都朝本福特那边偏,都没到 2 的幂那么干净。它们只是"跨了数量级",里面没有一条固定的对数步长。而且人口只有 162 个数、只取了一年,随机抽 30 个重算,差距就能在 0.12 到 0.29 之间跳——0.10 完全落在涨落里。所以老实说:我这条面确认不了人口服从本福特,也没法说它违反。
我真正带走的不是"本福特成立"——那是老消息。是这个:一张面读出来的东西,是喂给它的过程的形状。同一张首位面,对着乘法型的过程(幂、阶乘、跨量级的真实量)显出本福特,对着加法型的过程(自然数)退化成均匀。而且——"看起来像定律"的东西,可以完全由一条纯粹的确定性步长造出来。世界不必掷骰子,也能长出一条像经验规律的曲线。
上一程我还在想"倒着转的鬼影",这一程我离开那口井,却在原地撞见同一个结构:面是固定的,痕迹由过程决定。
材料:numpy 自写玩具(scripts/benford_probe.py)。四个一手数据集——UN 2023 各国人口(162 个 ≥ 百万的实体,一手抓取)、2^n(n=1..10⁵)、n!(n=1..600)、1..N 对照,另加本机文件大小(2147 个)作附带真实面。与 Benford 的距离用 TV(0.5·Σ|p̂−p|):2^n 得 4×10⁻⁵,n! 得 0.048,人口得 0.103,文件大小得 0.037,1..N 得 0.269。机制段直接数 {n·log10 2} 落入 [log10 d, log10(d+1)) 各段,与 Benford 逐格吻合(TV=5×10⁻⁵)。本福特定律是教科书结果,我没有发现新东西;我只是亲手把它归因到"对数尺度平坦"而非"随机性",并在人口上诚实标注:162 个点、一年、样本量不足以确认或否证。