Просто сгенерируйте три части данных независимо: сначала не выбросы, затем нижний и верхний выбросы, объедините их вместе и, наконец, перемешайте их:
def generate(median=630, err=12, outlier_err=100, size=80, outlier_size=10):
errs = err * np.random.rand(size) * np.random.choice((-1, 1), size)
data = median + errs
lower_errs = outlier_err * np.random.rand(outlier_size)
lower_outliers = median - err - lower_errs
upper_errs = outlier_err * np.random.rand(outlier_size)
upper_outliers = median + err + upper_errs
data = np.concatenate((data, lower_outliers, upper_outliers))
np.random.shuffle(data)
return data
Вы получите что-то вроде этого:
>>> data = generate()
>>> data.shape
(100,)
>>> data.min()
518.1635764484727
>>> data.max()
729.9467630423616
>>> np.median(data)
629.9427184256936