牛叔叔 的笔记

好好学习

2019-11-17 17:57

有趣的本福特定律

牛叔叔

三体

(1452)

(0)

收藏


1881年,天文学家西蒙·纽康发现对数表包含以1起首的数那首几页较其他页破烂。可是,亦可以以任何书起首数页也会较破烂这个观点解释。这个故事可能是虚构的。

1938年,物理学家法兰克·本福特重新发现这个现象,还通过了检查许多数据来证实这点。

2009年,西班牙数学家在素数中发现了一种新模式,并且惊讶于为何现在才为人发现。虽然素数一般被认为是随机分布的,但西班牙数学家发现素数数列中每个素数的首位数字有明显的分布规律,它可以被描述了素数的本福特定律。这项新发现除了提供对素数属性的新洞见之外,还能应用于欺骗检测和股票市场分析等领域。


本福特定律,也称为本福德法则,说明一堆从实际生活得出的数据中,以1为首位数字的数的出现机率约为总数的三成,接近期望值1/9的3倍。推广来说,越大的数,以它为首几位的数出现的机率就越低。它可用于检查各种数据是否有造假。


本福特定律说明在b进位制中,以n起头的数出现的概率为。本福特定律不但适用于个位数字,连多位的数也可用。


十进制首位数字的出现概率(%,小数点后一个位):

dp
130.1%
217.6%
312.5%
49.7%
57.9%
66.7%
75.8%
85.1%
94.6%


编写了一段Java代码,求出斐波那契数列前90位数,计算了一下首位数出现的概率,大家看看,还真符合。

package com.wanmait.demo;
public static void main(String[] args) {
		long[] arr = new long[90];
		arr[0] = 1;
		arr[1] = 1;
		for(int i=2;i<arr.length;i++) {
			arr[i] = arr[i-1]+arr[i-2];
		}
		int[] p = new int[10];
		for(int i=0;i<arr.length;i++) {
			String t = String.valueOf(arr[i]);
			p[t.charAt(0)-'0']++;
		}
		for(int i=1;i<p.length;i++) {
			System.out.printf("%d  %.2f%%\n",i,p[i]*100/arr.length);
		}
	}


运行结果:

1  30.00%
2  18.89%
3  12.22%
4  8.89%
5  7.78%
6  6.67%
7  4.44%
8  6.67%
9  4.44%


long型整数范围有限,只能大概到第90位,使用java提供的BigInteger可以方便的进行大数计算,这一样我们可以多计算一些位数,得出的统计相对更准确一些。


代码如下:

package com.wanmait.demo;
import java.math.BigInteger;

public class Test {

	public static void main(String[] args) {
		BigInteger[] nums = new BigInteger[10000];
		//long[] arr = new long[90];
		nums[0] = BigInteger.valueOf(1);
		nums[1] = BigInteger.valueOf(1);
		for(int i=2;i<nums.length;i++) {
			nums[i] = nums[i-1].add(nums[i-2]);
		}
		int[] p = new int[10];
		for(int i=0;i<nums.length;i++) {
			String t = String.valueOf(nums[i]);
			//System.out.println(t);
			p[t.charAt(0)-'0']++;
		}
		for(int i=1;i<p.length;i++) {
			System.out.printf("%d  %.2f%%\n",i,p[i]*100.0/nums.length);
		}
	}

}


计算结果:

1  30.11%
2  17.62%
3  12.50%
4  9.68%
5  7.92%
6  6.68%
7  5.80%
8  5.13%
9  4.56%


0条评论

点击登录参与评论