Получить случайные числа в пределах одного стандартного отклонения

Я хочу генерировать случайные числа, скажем, 100. Теперь я использую numpy для таких целей, как:

print numpy.random.normal(loc=200,scale=50,size=100)

Но я хочу, чтобы числа генерировались только на одно стандартное отклонение, кроме среднего значения, т.е. loc. Что было бы лучшим способом?

Должен ли я просто сделать что-то вроде:

print numpy.random.randint(150, high=250, size=100)

или есть другой способ сделать это?


person gthm    schedule 21.02.2015    source источник
comment
Что вы имеете в виду, сгенерировав только одно стандартное отклонение, кроме среднего значения? Вы хотите, чтобы результирующее распределение чисел имело стандартное отклонение, равное 1? В таком случае numpy.random.normal(loc=mean, scale=1.0, ...).   -  person Robert Kern    schedule 21.02.2015
comment
О, вы хотите усеченное нормальное распределение. У numpy.random этого нет, а у scipy.stats есть. from scipy import stats; stats.truncnorm.rvs(-1.0, 1.0, loc=200.0, scale=50.0, size=100)   -  person Robert Kern    schedule 21.02.2015
comment
Может быть, сам вопрос является глупым вопросом, поскольку нормально распределенные данные должны содержать значения 0-max с кривой в форме колокола.   -  person gthm    schedule 21.02.2015
comment
Ну -inf до +inf.   -  person Robert Kern    schedule 21.02.2015


Ответы (1)


Выберите один номер

Как предложено в @Robert Kern's comment используйте truncnorm

from scipy import stats

arr = stats.truncnorm.rvs(-1, 1, loc=200.0, scale=50.0, size=1) 
print(arr[0])     

Первые два параметра указывают диапазон [a, b] (измеряется в стандартных отклонениях), loc — среднее значение (центр распределения), а scale — стандартное отклонение (насколько разбросано распределение).

Номера участков в пределах от -1 до +3 STD

import matplotlib.pyplot as plt
from scipy import stats

# -1 to +3 standard deviations apart
r = stats.truncnorm.rvs(-1, 3, loc=200.0, scale=50.0, size=10**6)

plt.hist(r, bins=100, color='blue')
plt.xlabel("value")
plt.ylabel("frequency")
plt.show()

-1 до +3 stds


Примечание: randint() и normal() не выбирают число одинаково.

numpy.random.randint

Возвращает случайные целые числа из «дискретно-равномерного» распределения в «полуоткрытом» интервале.

numpy.random.normal

Нарисуйте случайные выборки из нормального (гауссовского) распределения.

Шансы получить любое число в выбранном интервале с использованием randint() одинаковы, в отличие от чисел из нормальное распределение (шансы получить число ближе к пику выше).

person user    schedule 21.02.2015