Zipf概率分布常被用于建模P2P系统中文件大小分布或项目访问分布,例如“Web Caching and Zip like Distribution Evidence and Implications”,但是Boost和GSL(Gnu Scientific Library)都没有提供使用该分布生成随机数的实现。我没有在常见搜索引擎上找到(可信赖的)实现。
如何使用U(0,1)随机生成器(例如Mersenne Twister)生成遵循Zipf分布的随机数?
Zipf概率分布常被用于建模P2P系统中文件大小分布或项目访问分布,例如“Web Caching and Zip like Distribution Evidence and Implications”,但是Boost和GSL(Gnu Scientific Library)都没有提供使用该分布生成随机数的实现。我没有在常见搜索引擎上找到(可信赖的)实现。
如何使用U(0,1)随机生成器(例如Mersenne Twister)生成遵循Zipf分布的随机数?
alpha >= 0
的n
个项目: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
from functools import reduce
- Michael MiorzipfR是一个使用R语言实现的免费开源库。VGAM是另一个实现Zipf的R包。
值得注意的是,Gnu Scientific Library有一个Pareto分布的实现,它实际上是离散Zipf分布的连续模拟。
此外,Zeta分布对于无限大的N等同于Zipf。 GSL有一个Riemann zeta函数的实现,因此您可以使用它来构建分布。
numpy.random.zipf使用Python生成Zipf样本。