Хорошо, вот рабочий и слегка протестированный код, который кажется более быстрым, используя составное свойство распределения Beta-Binomial .
Мы выбираем p
из беты и затем используем его в качестве параметра для биномиального. Если вы выберете векторы больших размеров, это будет еще быстрее.
import numpy as np
def sample_Beta_Binomial(a, b, n, size=None):
p = np.random.beta(a, b, size=size)
r = np.random.binomial(n, p)
return r
np.random.seed(777777)
q = sample_Beta_Binomial(0.5, 0.5, 3, size=10)
print(q)
Вывод
[3 1 3 2 0 0 0 3 0 3]
Быстрый тест
np.random.seed(777777)
n = 10
a = 2.
b = 2.
N = 100000
q = sample_Beta_Binomial(a, b, n, size=N)
h = np.zeros(n+1, dtype=np.float64) # histogram
for v in q: # fill it
h[v] += 1.0
h /= np.float64(N) # normalization
print(h)
печатает гистограмму
[0.03752 0.07096 0.09314 0.1114 0.12286 0.12569 0.12254 0.1127 0.09548 0.06967 0.03804]
, что очень похоже на зеленый график на странице Wiki в бета-биномиальном виде