Полагаю, вы могли бы использовать что-то вроде np.random.normal()
.
Это позволяет генерировать массив любой формы, какой вы захотите.
Первый аргумент loc
является центром вашего стандартного распределения, 50
в вашем примере выше.
Второй аргумент scale
- это стандартное отклонение (распространение или «ширина») распределения.
Последний аргумент size
- это просто выходная форма, которая может быть число или кортеж целых чисел
Затем мы будем использовать этот массив для выборки из распределения и np.clip
выходов до минимума. максимальное значение (как мы могли бы получить экстремальные значения в зависимости от размера нашего массива). Наконец, мы сортируем вывод до np.sort
def mynormrange(min, max, stddev, numberofpoints):
# (min+max)//2 yields the centre point of our distribution
distribution = np.random.normal(loc=(min+max)//2,
scale=stddev,
size=numberofpoints)
return np.sort(np.clip(distribution, min, max), axis=None)
>>> mynormrange(min=0, max=100, stddev=28, numberofpoints=20)
array([ 0. , 11.84519127, 16.3296094 , 24.55199703, 25.30222761,
30.46270933, 30.52531999, 34.18142498, 42.30422449, 44.8864856 ,
48.54756954, 56.00797349, 58.51853892, 58.65086592, 61.0481076 ,
68.87172721, 77.65995267, 85.73321417, 86.2329193 , 86.31444371])
Что касается обратного этого ... Я думаю, вы могли бы найти аналогичную функцию и использовать та же техника отбора проб, что и выше. Я прокомментирую / отредактирую это, когда / если найду это.
Дайте мне знать, если это поможет, и если у вас есть какие-либо вопросы.