程序驗證本福特定律

1、定義

本福特定律,也稱爲本福德法則,說明一堆從實際生活得出的數據中,以1爲首位數字的數的出現機率約爲總數的三成,接近指望值1/9的3倍。推廣來講,越大的數,以它爲首幾位的數出現的機率就越低。它可用於檢查各類數據是否有造假。[1]php

2、數學

本福特定律說明在b進位制中,以數n起頭的數出現的機率爲html

本福特定律不但適用於個位數字,連多位的數也可用。
在十進制首位數字的出現機率(%,小數點後一個位):spa

d p
1 30.1%
2 17.6%
3 12.5%
4 9.7%
5 7.9%
6 6.7%
7 5.8%
8 5.1%
9 4.6%

3、證實

其實對於本福特定律,到目前爲止尚未公認的證實。code

大部分數據可以知足,也有部分數據是不知足的,好比均勻分佈的數據htm

一、不少數據的增加量會正比於存量(相似銀行的存款業務,存的越多,收益越多)會有這麼一個公式:blog

ΔN/(N*Δt)=const(常數)get

其中ΔN是增量,Δt是單位時間,N是存量數學

二、增加是指數增加,即相同時間內,翻的倍數是相同的,有it

N=N0*e^(ct)table

其中,當存量N0增加到N的時候,須要 t 時間,c是常數

可知,當N1增加到N2的時候,須要的時間是:

t = c'lg(N2/N1)

三、計算

t1 = c'lg(2)

t2 = c'lg(3/2)

...

tn = c'lg(n+1)/n

驗證下數據首位從 1~9 所須要的時間

t = t1 + t2 + ... + t9 = c'lg(10) = c'

P1 = t1 / t = c'lg(2)/c' = lg(2) = lg(1+1)/1 ≈ 30.1%

Pn = tn / t = lg(n+1)/n

這裏聯想到老祖宗的一句話,萬事開頭難,或許是這個意思吧。其實這個定律到目前爲止尚未一個公認的證實,只是不少數據是符合本福特定律的。

4、驗證

驗證本福特定律對數字有必定的要求,必須是雜亂無章的數據,好比國家人口、GDP等

下面用斐波那契數列和隨機數驗證下

一、斐波那契數列驗證

PHP:

<?php $size = 1000; $arr = array(1, 2); for($i = 2; $i < $size; $i++) { $arr[] = $arr[$i-1] + $arr[$i-2]; } $sum = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0); for($k = 0; $k < count($arr); $k++) { $index = substr($arr[$k], 0, 1); $sum[$index]++; } print_r($sum); for($n = 1; $n < count($sum); $n++) { echo "首位 {$n} ,比例 " . round($sum[$n]/$size, 2) . "\n"; } ?>

輸出:

Array ( [0] => 0 [1] => 300 [2] => 177 [3] => 125 [4] => 96 [5] => 80 [6] => 67 [7] => 57 [8] => 53 [9] => 45 ) 首位 1 ,比例 0.3 首位 2 ,比例 0.18 首位 3 ,比例 0.13 首位 4 ,比例 0.1 首位 5 ,比例 0.08 首位 6 ,比例 0.07 首位 7 ,比例 0.06 首位 8 ,比例 0.05 首位 9 ,比例 0.05

 

二、隨機數,注意,程序的隨機數是僞隨機數,這裏加上一個隨機的增加率,此外還要注意數據可能會太長致使越界,加個循環保證隨機數不超過十的十五次方

PHP:

<?php $count = 0; $size = 1000; $grow = 80000;//增加率
$a = rand(); $sum = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0); for ($i = 0; $i < $size; $i++) { //模擬天然增加率,8w可改 
    $k = (rand() - 16384) / $grow + 1; $a = $a + $k * $a; while (mb_strlen($a) >= 15) { //降下數量級對首位無影響
        $a /= 10; } $index = substr($a, 0, 1); $sum[$index]++; } print_r($sum); for($n = 1; $n < count($sum); $n++) { echo "首位 {$n} ,比例 " . round($sum[$n]/$size, 2) . "\n"; } ?>

輸出:

Array ( [0] => 0 [1] => 303 [2] => 176 [3] => 121 [4] => 111 [5] => 89 [6] => 65 [7] => 54 [8] => 36 [9] => 45 ) 首位 1 ,比例 0.3 首位 2 ,比例 0.18 首位 3 ,比例 0.12 首位 4 ,比例 0.11 首位 5 ,比例 0.09 首位 6 ,比例 0.07 首位 7 ,比例 0.05 首位 8 ,比例 0.04 首位 9 ,比例 0.05

 

 5、結論

對於斐波那契數列和隨機數,得出來的結果是比較接近於本福特定律的,這也就是本福特定律大多數狀況下能夠用來驗證數據是否造假的緣由

 

參考:

[1]. 本福特定律

原文出處:https://www.cnblogs.com/lyc94620/p/12079472.html

相關文章
相關標籤/搜索