生成Zipf分发的随机数

时间:2009-09-02 10:50:45

标签: math random probability

Zipf probability distribution通常用于模拟P2P系统中项目的文件大小分布或项目访问分布。例如"Web Caching and Zip like Distribution Evidence and Implications",但BoostGSL (Gnu Scientific Library)都没有提供使用此分布生成随机数的实现。我没有找到使用通用搜索引擎的(值得信赖的)实现。

如何使用U(0,1)随机生成器根据Zipf分布分布的随机数,例如Mersenne twister

5 个答案:

答案 0 :(得分:11)

zipfR是一个用R实现的免费开源库。VGAM是另一个R包,它也实现了Zipf。

值得注意的是Gnu Scientific Libraryimplementation Pareto distribution,这实际上是离散Zipf分布的连续模拟。

此外,Zeta distribution相当于无限 N 的Zipf。 GSL有implementationRiemann 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的答案。他的算法有一些很好的优化建议。