Генерировать случайные числа, распространяемые Zipf
распределение вероятности Zipf часто используется для моделирования распределения размера файла или распределения доступа к элементам в элементах систем P2P. например "Веб-кэширование и почтовый индекс, как данные и последствия распространения" , но не Boost или GSL (Научная библиотека Gnu) предоставляют реализацию для генерации случайных чисел с использованием этого распределения. Я не нашел (надежную) реализацию с использованием общих поисковых систем.
Как случайные числа, которые распределяются в соответствии с распределением Zipf, используя случайный генератор U (0,1), например. Mersenne twister?
Ответы
Ответ 1
zipfR - бесплатная библиотека с открытым исходным кодом, реализованная с R. VGAM - это еще один пакет R, который также реализует Zipf.
Также стоит отметить, что Научная библиотека Gnu имеет реализация распределение Парето, которое фактически является непрерывным аналогом дискретного распределения Zipf.
Кроме того, распространение Zeta эквивалентно Zipf для бесконечного N. GSL имеет реализация функция zeta Riemann, поэтому вы можете использовать ее для самостоятельного построения дистрибутива.
Ответ 2
numpy.random.zipf генерирует образцы Zipf с использованием python.
Ответ 3
Здесь генератор распределения Python Zipf-like для 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
Ответ 4
Недавно был разработан очень эффективный алгоритм генерации распределенных случайных вариаций Zipf для следующих версий ( >= 3.6) библиотеки Apache Commons Math (см. код здесь). Он использует выборку отбраковки-инверсии, а также работает с показателями менее 1. Это не требует предварительного расчета CDF и сохранения его в памяти. Кроме того, затраты на создание одного образца постоянны и не увеличиваются с количеством элементов.
Ответ 5
Мы обсуждали ответ @stanga в этой теме. Есть несколько хороших оптимизаций, предложенных для его алгоритма.