Math 生成Zipf分布的随机数

Math 生成Zipf分布的随机数,math,random,probability,Math,Random,Probability,在P2P系统中,通常使用该模型对项目上的文件大小分布或项目访问分布进行建模。e、 但两者都没有提供使用此分布生成随机数的实现。我还没有找到一个使用通用搜索引擎的(值得信赖的)实现 如何通过使用U(0,1)随机生成器(例如 是一个用R实现的免费开源库。是另一个也实现Zipf的R包 还值得注意的是,它有一个有效的连续模拟离散Zipf分布 另外,对于无限N,与Zipf是等效的。GSL有一个of the,因此您可以使用它自己构造分布。使用python生成Zipf示例。这里有一个类似python的分布生成

在P2P系统中,通常使用该模型对项目上的文件大小分布或项目访问分布进行建模。e、 但两者都没有提供使用此分布生成随机数的实现。我还没有找到一个使用通用搜索引擎的(值得信赖的)实现

如何通过使用U(0,1)随机生成器(例如

是一个用R实现的免费开源库。是另一个也实现Zipf的R包

还值得注意的是,它有一个有效的连续模拟离散Zipf分布


另外,对于无限N,与Zipf是等效的。GSL有一个of the,因此您可以使用它自己构造分布。

使用python生成Zipf示例。

这里有一个类似python的分布生成器,用于
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

我们正在讨论中的@stanga的答案。他的算法有一些很好的优化建议。

最近为Apache Commons数学库的下一个版本(>=3.6)开发了一个非常有效的生成Zipf分布随机变量的算法(参见代码)。它利用拒绝反转采样,也适用于指数小于1的情况。它不需要预先计算CDF并将其保存在内存中。此外,生成一个样本的成本是恒定的,并且不会随着项目数量的增加而增加。

非常好的答案。对于Python3.x,添加“from functools import*”或者可能是,
from functools import reduce
self.distMap=[math.pow(float(x),alpha)/zeta[-1]表示zeta中的x]+1表示VGAM。它的
dzipf
函数将为您提供每个等级的概率列表,您可以使用该列表生成项目访问。不幸的是,它使用了Riemann的zeta函数,因此它只需要大于1的指数,而许多P2P群体最好使用小于1的指数进行建模。目前,这几乎不能作为答案。你应该在这里包括你的解决方案,而不仅仅是参考它。最近的一篇论文(Maurizio Naldi,2015)提出了一种近似算法,其中的参数权衡了时间和精度。对于α(0)的合理范围