<p>Python有许多方法可以生成不同的随机数分布,请参见<a href="http://docs.python.org/2/library/random.html" rel="nofollow noreferrer">documentation for the ^{<cd1>} module</a>。不幸的是,如果没有适当的数学背景,尤其是考虑到所需的参数,它们是无法理解的。在</p>
<p>我想知道这些方法中是否有一种能够产生服从<a href="http://en.wikipedia.org/wiki/Benford%27s_law" rel="nofollow noreferrer">Benford's Law</a>分布的随机数,以及哪些参数值是合适的。也就是说,对于一组整数,这些整数应该以“1”开头,大约30%的时间,2“大约18%的时间,等等。
</p><hr/>
使用<a href="https://stackoverflow.com/a/14556655/5987">Jan Dvorak's answer</a>我把下面的代码组合在一起,它看起来工作得很好。
<pre><code>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})
</code></pre>