Python 3.1 - Создание нормального дистрибутива - PullRequest
7 голосов
/ 15 января 2011

У меня есть scipy and numpy, Python v3.1

Мне нужно создать одномерный массив длиной 3 миллиона, используя случайные числа между (и включая) 100-60,000.Это должно соответствовать нормальному распределению.

Используя 'a = numpy.random.standard_normal (3000000)', я получаю нормальное распределение для этой требуемой длины;не уверен, как достичь требуемого диапазона.

Ответы [ 3 ]

10 голосов
/ 15 января 2011

Стандартное нормальное распределение имеет среднее значение 0 и стандартное отклонение 1. Что я понимаю из ваших требований, так это то, что вам нужен ((60000-100) / 2, (60000-100) / 2).Возьмите каждое значение из standard_normal() результата, умножьте его на новую дисперсию и добавьте новое среднее значение .

. Я не использовал NumPy, но быстрый поиск документов говорит, чтоВы можете достичь желаемого напрямую, используя numpy.random.normal()

Последний тезбит: нормальные распределения не ограничены.Это означает, что нет значения с вероятностью ноль.Ваши требования должны соответствовать средним и отклонениям (или стандартным отклонениям), а не пределам.

6 голосов
/ 15 января 2011

Если вы хотите действительно случайное нормальное распределение, вы не можете гарантировать, насколько далеко будут распространяться числа. Вы можете уменьшить вероятность выбросов, указав стандартное отклонение

>>> n = 3000000
>>> sigma5 = 1.0 / 1744278
>>> n * sigma5
1.7199093263803131  # Expect one values in 3 mil outside range at 5 stdev.
>>> sigma6 = 1.0 / 1 / 506800000
>>> sigma6 = 1.0 / 506800000
>>> n * sigma6
0.0059194948697711127 # Expect 0.005 values in 3 mil outside range at 6 stdev.
>>> sigma7 = 1.0 / 390600000000
>>> n * sigma7
7.6804915514592934e-06

Следовательно, в этом случае гарантируя, что стандартное отклонение составляет всего 1/6 или 1/7 от половины диапазона, вы получите разумную уверенность в том, что ваши данные не будут превышать диапазон.

>>> range = 60000 - 100
>>> spread = (range / 2) / 6 # Anything outside of the range will be six std. dev. from the mean
>>> mean = (60000 + 100) / 2
>>> a = numpy.random.normal(loc = mean, scale = spread, size = n) 
>>> min(a)
6320.0238199673404
>>> max(a)
55044.015566089176

Конечно, вы все еще можете указывать значения, выходящие за пределы диапазона

0 голосов
/ 15 января 2011

попробуйте этот приятный маленький метод:

Вам понадобится метод, который просто создает одно случайное число.

import random
list = [random.randint(min,max) for i in range(numitems)]

Это даст вам список с numitems случайными числами между минимальным и максимальным значениями.

Конечно, 3000000 - это много элементов в памяти.Рассмотрите возможность создания случайных чисел так, как они нужны программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...