八年前,我写了一篇关于2 的幂的前导数字的博客文章。在那篇文章中,我说过本福德定律对 2 n的前导数字的分布给出了非常好的预测。在这篇文章中,我将使这一说法更加有力。
如果序列中以数字d开头的前N 个元素的比例渐近,则序列遵循以 10 为基数的本福德定律
N log 10 (1 + 1/ d )。
例如,本福德定律适用于 2 的幂,但也适用于阶乘。一般来说,它仅适用于N趋于无穷大的极限。对于较大但有限的N值,它给出了良好的近似值,但无法保证近似值有多好。 除了有时有。
您可以使用本福德定律来估计n 的次数!以 1 开头,但它可以准确地告诉您 2 n以 1 开头的次数。确切的数字是本福德定律在d = 1 时给出的估计值,向下舍入到最接近的整数,即上面表达式的下限。
⌊ N log 10 (2)⌋
证明见[1]。以下 Python 代码演示了这一点。
导入小数 从数学导入 log10,地板 定义精确(N): c = 0 a = 小数.Decimal(1) 对于范围 (1, N+1) 中的 i: 一个=一个*2 如果 int(str(a)[0]) == 1: c+=1 返回c def估计(N): 返回 N*log10(2) 对于范围 (1, 10000) 内的 i: 断言(精确(i)== int(地板(估计(i))))
该代码使用decimal
类来提高效率。请参阅 Andrew Dalke 对原始帖子的评论。 [2]
本福德定律准确预测序列 2 n以 1 开头的频率。它还准确预测以 4 开头的频率,但对于其他数字并不准确。
相关帖子
[1]蔡兆东,马修·福斯特,AJ·希尔德布兰德,李俊贤,张远。本福德定律在数学中的惊人准确性。美国数学月刊,卷。 127,第 3 期(2020 年 3 月),第 217–237 页
[2] 函数exact
对于N的单个值是有效的,但是当您使用它来测试N的范围时,会出现很多冗余计算,就像我们在循环中使用assert
语句所做的那样。重写代码以使其更有效地检查范围并不困难。
当本福德定律准确时,帖子首次出现在约翰·D·库克 (John D. Cook)上。
原文: https://www.johndcook.com/blog/2025/04/12/exact-benford/