Zipf probability distribution通常用于模拟P2P系统中项目的文件大小分布或项目访问分布。例如"Web Caching and Zip like Distribution Evidence and Implications",但Boost或GSL (Gnu Scientific Library)都没有提供使用此分布生成随机数的实现。我没有找到使用通用搜索引擎的(值得信赖的)实现。
如何使用U(0,1)随机生成器根据Zipf分布分布的随机数,例如Mersenne twister?
答案 0 :(得分:11)
zipfR是一个用R实现的免费开源库。VGAM是另一个R包,它也实现了Zipf。
值得注意的是Gnu Scientific Library有implementation Pareto distribution,这实际上是离散Zipf分布的连续模拟。
此外,Zeta distribution相当于无限 N 的Zipf。 GSL有implementation的Riemann zeta function,因此您可以使用它来自己构建分发。
答案 1 :(得分:10)
numpy.random.zipf使用python生成Zipf样本。
答案 2 :(得分:10)
这是一个类似于Python Zipf的分布式生成器,用于n
项参数alpha >= 0
:
import random
import bisect
import math
class ZipfGenerator:
def __init__(self, n, alpha):
# Calculate Zeta values from 1 to n:
tmp = [1. / (math.pow(float(i), alpha)) for i in range(1, n+1)]
zeta = reduce(lambda sums, x: sums + [sums[-1] + x], tmp, [0])
# Store the translation map:
self.distMap = [x / zeta[-1] for x in zeta]
def next(self):
# Take a uniform 0-1 pseudo-random value:
u = random.random()
# Translate the Zipf variable:
return bisect.bisect(self.distMap, u) - 1
答案 3 :(得分:4)
最近为Apache Commons Math库的下一个版本(> = 3.6)开发了一种非常有效的生成Zipf分布式随机变量的算法(参见代码here)。它使用拒绝反转采样,也适用于小于1的指数。它不需要预先计算CDF并将其保存在内存中。此外,生成一个样本的成本是恒定的,不会随着项目数量的增加而增加。
答案 4 :(得分:0)
我们在this thread讨论了@stanga的答案。他的算法有一些很好的优化建议。