Zipf 概率分布通常用于对 P2P 系统中项目的文件大小分布或项目访问分布进行建模。例如“Web Caching and Zip like Distribution Evidence and Implications”,但Boost或GSL(Gnu 科学图书馆)都没有提供使用此分布生成随机数的实现。我还没有找到使用通用搜索引擎的(值得信赖的)实现。
如何使用 U(0,1) 随机生成器(例如Mersenne twister )根据 Zipf 分布分布的随机数?
Zipf 概率分布通常用于对 P2P 系统中项目的文件大小分布或项目访问分布进行建模。例如“Web Caching and Zip like Distribution Evidence and Implications”,但Boost或GSL(Gnu 科学图书馆)都没有提供使用此分布生成随机数的实现。我还没有找到使用通用搜索引擎的(值得信赖的)实现。
如何使用 U(0,1) 随机生成器(例如Mersenne twister )根据 Zipf 分布分布的随机数?
这是一个类似 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
numpy.random.zipf使用 python 生成 Zipf 样本。
最近为 Apache Commons Math 库的下一个版本 (>= 3.6) 开发了一种非常有效的生成 Zipf 分布随机变量的算法(请参见此处的代码)。它利用拒绝反转采样,也适用于小于 1 的指数。它不需要预先计算 CDF 并将其保存在内存中。此外,生成一个样本的成本是恒定的,不会随着项目数量的增加而增加。
我们在这个线程中讨论了@stanga 的答案。他的算法有一些不错的优化建议。