gpt4 book ai didi

python - 是否存在服从本福德定律的随机数分布?

转载 作者:太空狗 更新时间:2023-10-29 19:35:27 24 4
gpt4 key购买 nike

Python 有很多方法可以生成不同分布的随机数,请参阅 documentation for the random module .不幸的是,如果没有适当的数学背景,尤其是考虑到所需的参数,它们并不是很容易理解。

我想知道这些方法中的任何一种是否能够生成服从 Benford's Law 分布的随机数,以及哪些参数值是合适的。也就是说,对于整数群体,这些整数在大约 30% 的时间应该以“1”开头,在大约 18% 的时间以“2”开头,等等。


使用 John Dvorak's answer ,我将以下代码放在一起,它似乎运行良好。

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

关于这在不同版本的 Python 之间是否一致工作的问题也出现了。这不是一个需要回答的小问题,因为随机数的性质 - 您预计每次运行都会有一些变化,有时在 random 库的不同版本之间。避免这种情况的唯一方法是在每次运行之间一致地为随机数生成器播种。我已将其添加到我的测试中,并且在 Python 2.7.1、3.8.6 和 3.9.1 中得到了完全相同的结果。

>>> random.seed(7919)
>>> Counter(str(i)[0] for i in benfords_range_gen(10000, 1000000))
Counter({'1': 301032, '2': 176404, '3': 125350, '4': 96503, '5': 78450, '6': 67198, '7': 58000, '8': 51342, '9': 45721})

最佳答案

本福德定律描述了一组数字的第一位数字的分布,如果这些数字是从对数刻度上的较宽范围内选择的。如果你准备一个十年以上的对数均匀分布,它也会遵守法律。 10^[0,1) 将生成该分布。

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

关于python - 是否存在服从本福德定律的随机数分布?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14556451/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com