程式驗證本福特定律

2022-06-20 09:48:10 字數 2528 閱讀 7193

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

本福特定律說明在b進製中,以數n起頭的數出現的概率為

本福特定律不但適用於個位數字,連多位的數也可用。

在十進位制首位數字的出現概率(%,小數點後乙個位):dp

130.1%

217.6%

312.5%

49.7%

57.9%

66.7%

75.8%

85.1%

94.6%

其實對於本福特定律,到目前為止還沒有公認的證明。

大部分資料能夠滿足,也有部分資料是不滿足的,比如均勻分布的資料

1、很多資料的增長量會正比於存量(類似銀行的存款業務,存的越多,收益越多)會有這麼乙個公式:

δn/(n*δt)=const(常數)

其中δn是增量,δt是單位時間,n是存量

2、增長是指數增長,即相同時間內,翻的倍數是相同的,有

n=n0*e^(ct)

其中,當存量n0增長到n的時候,需要 t 時間,c是常數

可知,當n1增長到n2的時候,需要的時間是:

t = c'lg(n2/n1)

3、計算

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

這裡聯想到老祖宗的一句話,萬事開頭難,或許是這個意思吧。其實這個定律到目前為止還沒有乙個公認的證明,只是很多資料是符合本福特定律的。

驗證本福特定律對數字有一定的要求,必須是雜亂無章的資料,比如國家人口、gdp等

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

1、斐波那契數列驗證

php:

<?php 

$size = 1000;

$arr = array(1, 2);

for($i = 2; $i

< $size; $i++)

$sum = array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0);

for($k = 0; $k

< count($arr); $k++)

print_r($sum

);for($n = 1; $n

< count($sum); $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

2、隨機數,注意,程式的隨機數是偽隨機數,這裡加上乙個隨機的增長率,此外還要注意資料可能會太長導致越界,加個迴圈保證隨機數不超過十的十五次方

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++)

$index = substr($a, 0, 1);

$sum[$index]++;

}print_r($sum

);for($n = 1; $n

< count($sum); $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

對於斐波那契數列和隨機數,得出來的結果是比較接近於本福特定律的,這也就是本福特定律大多數情況下可以用來驗證資料是否造假的原因

參考:[1]. 本福特定律

Benford定律 本福特定律 資料造假

本福特定律,也稱為本福德法則,說明一堆從實際生活得出的資料中,以1為首位數字的數的出現機率約為總數的三成,接近期望值1 9的3倍。推廣來說,越大的數,以它為首幾位的數出現的機率就越低。它可用於檢查各種資料是否有造假。要準確的判斷資料是否為自然生成還需要計算兩個指標,分別為ks值和截止值。然後對兩個指...

DBCC工具程式 驗證狀態

1.dbcc checkalloc 檢查指定資料庫的磁碟空間分配結構的一致性 語法 例 check the adventureworks database.dbcc checkalloc adventureworks go2.dbcc checkcatalog 檢查指定資料庫內的目錄一致性 語法 3...

1 修改程式驗證流程

1,下面這段程式中,verify password是驗證密碼的函式,我們要做的是把編譯好的程式直接跳過程式驗證流程。include define password 1234567 int verify password char password main else 2,利用ollydbg開啟上面這...