是否有符合本福特定律的随机数分布?

Mar*_*som 9 python random benfords-law

Python有许多方法可以生成不同的随机数分布,请参阅模块文档random.不幸的是,没有适当的数学背景,它们并不是非常容易理解,特别是考虑到所需的参数.

我想知道这些方法中是否有任何一种能够产生符合Benford定律的分布的随机数,以及哪些参数值是合适的.即对于整数群体,那些整数应该在大约30%的时间以'1'开头,'2'在大约18%的时间开始,等等.


使用Jan Dvorak的答案我将以下代码放在一起,它似乎完美无缺.

def benfords_range_gen(stop, n):
    """ A generator that returns n random integers
    between 1 and stop-1 and whose distribution
    meets Benford's Law i.e. is logarithmic.
    """
    multiplier = math.log(stop)
    for i in range(n):
        yield int(math.exp(multiplier * random.random()))

>>> from collections import Counter
>>> Counter(str(i)[0] for i in benfords_range_gen(10000, 1000000))
Counter({'1': 300696, '2': 176142, '3': 124577, '4': 96756, '5': 79260, '6': 67413, '7': 58052, '8': 51308, '9': 45796})
Run Code Online (Sandbox Code Playgroud)

Joh*_*rak 20

本福特定律描述了一组数字的第一个数字的分布,如果数字是从对数尺度上的宽范围中选择的.如果你准备一个十年的对数均匀分布,它也会尊重法律.10^[0,1)将产生该分布.

这将产生所需的分布: math.floor(10**random.random())