生成Zipf分发的随机数

dme*_*ter 17 random math probability

齐普夫概率分布经常被用来在P2P系统的项目文件大小分布或项目的访问分布模型.例如"Web缓存和Zip像分布证据和影响",但BoostGSL(Gnu科学库)都没有提供使用此分布生成随机数的实现.我还没有找到使用常见搜索引擎的(值得信赖的)实现.

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

ire*_*ses 11

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

另外值得一提的是,GNU科学图书馆有一个实现了的帕累托分布,有效地为离散分布齐普夫的连续模拟.

此外,Zeta分布相当于无限N的 Zipf .在GSL有一个实现了的黎曼zeta函数,所以你可以用它来构建自己的分配.


sta*_*nga 11

这是一个类似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
Run Code Online (Sandbox Code Playgroud)

  • 很好的答案。对于 Python 3.x,添加“from functools import *” (2认同)

Yuv*_*l F 10

numpy.random.zipf使用python生成Zipf样本.

  • 不幸的是,它使用Riemann的zeta函数,因此它只需要高于1的指数,而许多P2P群体最好用低于1的指数建模. (7认同)