January 18, 2023

Как создать гистограмму для заданного распределения вероятности (для функционального тестирования сервера)?


Это быстро и, вероятно, не очень точно, но если вы рассчитаете PDF самостоятельно, то, по крайней мере, облегчите укладку нескольких меньших/больших на одной временной шкале. dev - среднеквадратичное отклонение шума Гуассиана, который управляет шероховатостью. Обратите внимание, что это не "правильный" способ генерировать то, что вы хотите, но это просто.

import math
from datetime import datetime, timedelta, date
from random import gauss

how_many_responses = 1000
start_date = date(2008, 5, 1)
end_date = date(2008, 6, 1)
num_days = (end_date - start_date).days + 1
timeline = [start_date + timedelta(i) for i in xrange(num_days)]

def weibull(x, k, l):
    return (k / l) * (x / l)**(k-1) * math.e**(-(x/l)**k)

dev = 0.1
samples = [i * 1.25/(num_days-1) for i in range(num_days)]
probs = [weibull(i, 2, 0.5) for i in samples]
noise = [gauss(0, dev) for i in samples]
simdata = [max(0., e + n) for (e, n) in zip(probs, noise)]
events = [int(p * (how_many_responses / sum(probs))) for p in simdata]

histogram = zip(timeline, events)

print '\n'.join((d.strftime('%Y-%m-%d ') + "*" * c) for d,c in histogram)