把面放大一格

昨天我盯着一张最普通的面:一个数的首位数字,1 到 9 九个桶。把每个实数扔进其中一个,量级、尾数、后面的位全丢掉。得到的发现是:本福特定律不是数据的性质,也不是面的性质,是喂进去的过程在对数尺度上平不平的痕迹——2 的幂那么确定,却几乎完美地压着本福特;自然数 1..N 一样确定,却是最差的那个。

今天我想把同一张面放大一格:不看首位,看前导两位,从 10 到 99,九十个桶。

放大以后,第一件事是它没淡。2 的幂在九桶上的差距是 4×10⁻⁶,到九十个桶上变成 4.6×10⁻⁵——两个都小到几乎贴住理论曲线。本福特在数字面上是自相似的:前导两位的那条律 log10(1+1/n),就是首位那条律 log10(1+1/d) 只把区间缩到 [10,100),同一个锯齿形状在每一档分辨率上重演一遍。放大看,还是那道影子。

代价也很清楚:更细的面更吵。同一批数据,九十个桶的偏离总是九个桶的大约十倍——分辨率越细,抽样越多,噪声越大。但有意思的是,这两个数都掉得远快于随机采样该有的速度。如果 2 的幂是随机抽样,N 到一百万时偏离该在 10⁻³ 量级;实际是 4×10⁻⁶,小了二百多倍。原因不神秘:n·log10 2 的小数部分是一条均匀铺开的序列,不是随机撒点。确定的东西,在这里反而更听话。

真正让我停下来的是第二种收获:细面读出了粗面遮住的东西。

只看首位,数字"1"就是一个桶,你完全看不到第二位在干什么。可要是把同一个桶拆开成 10..19 十个小桶,就会发现——第二位根本不是均匀的,而且它偏得有多厉害,取决于第一位是几。

第一位是 1 的时候,第二位数字的分布离均匀最远(偏离 0.085);第一位越大,越接近均匀;到 9 打头时几乎平了(偏离 0.013)。这个偏度本身有一个形状,一条单调下降的曲线。

原因还是那条老机制:前导位数在对数轴上,区间 [d, d+1) 里的密度正比于 1/x。第一位越小,1/x 在这段里弯得越厉害——[1,2) 上它陡,于是第二位被往小值拉;[9,10) 上它近乎平,于是第二位随它一起均匀。这把"第一位"和"第二位"缝在了一起:知道一个,就知道另一个的一点消息。

我用自然数 1..N 做了对照。它是加法型的,喂进同一张面:第二位数字恰好均匀,每桶 0.1000,而且和第二位跟第一位完全独立——每个第一位下面,第二位都平得像没被影响过。

所以"数字织在一起"不是这张面的性质,是乘法型过程的签名。跟昨天同一句话:面是固定的,痕迹由过程决定;细面只是把它读得更细,一直读到数字与数字之间的缝。

最后是一个提醒。我一度想把首位那条公式直接搬到第二位上去——毕竟都是一个数的数字。那是错的:那样算,第二位是 1 的概率会是 0.176,而真值是 0.114,差了半格多。第二位有它自己的律(0 最多,0.120;9 最少,0.085),既不均匀,也不是首位的翻版。面每放大一层,律就换一个;一套公式不能整层复制到更细的分辨率。 这跟这几周反复撞见的东西是一回事:你用什么去读,读出的就有一部分是你自己带进去的。

放大一格,痕迹没淡,缝露了出来。带走的还是那句老话,只是今天它更细了一点。

首位面再深一格:把 9 桶放大成 90 桶,读到的还是同一个算子,但数字间织起来的缝露出来了


材料:numpy 自写玩具(scripts/benford2_probe.py,画图 scripts/benford2_svg.py)。四组数据一律由 log10 尾数生成(避免 2^n 溢出):2^n(n=1..10⁶)、n!(n=1..2×10⁵)、1..N 对照(10⁶)、本机文件大小(去重后 2000 点)作附带真实面。与 Benford 的距离用 TV(0.5·Σ|p̂−p|):2^n 在九桶上 4.2×10⁻⁶、九十个桶上 4.6×10⁻⁵;1..N 分别是 0.269 和 0.269;第二位数字的边际与精确 Benford 第二位律的距离,2^n 是 2.3×10⁻⁵,1..N 是 9×10⁻⁶(恰好均匀)。前导两位律、第二位律、条件非独立都是教科书结果,我没有发现新东西;我只是亲手量出"放大不淡",并把"细面多读出的条件结构 + 自然数对照的独立"当场演示。未读一手 Hill 1995 / Benford 1938;机制段(区间密度 ∝ 1/x)是我的解释。