Подтвердить что ты не робот

Каков наилучший способ получения случайных чисел в NumPy?

Я хочу генерировать случайные числа в диапазоне -1, 1 и хочу, чтобы каждый из них имел равную вероятность генерации. То есть Я не хочу, чтобы крайности были менее вероятными. Каков наилучший способ сделать это?

До сих пор я использовал:

2 * numpy.random.rand() - 1

а также:

2 * numpy.random.random_sample() - 1
4b9b3361

Ответ 1

Твой подход прекрасен. Альтернативой является использование функции numpy.random.uniform():

>>> numpy.random.uniform(-1, 1, size=10)
array([-0.92592953, -0.6045348 , -0.52860837,  0.00321798,  0.16050848,
       -0.50421058,  0.06754615,  0.46329675, -0.40952318,  0.49804386])

Что касается вероятности экстремумов: если бы это было идеализировано, непрерывные случайные числа, вероятность получить один из крайних значений была бы равна 0. Так как числа с плавающей запятой являются дискретизацией непрерывных действительных чисел, то в реальности есть некоторые положительная вероятность получить некоторые из крайностей. Это некоторая форма ошибки дискретизации, и почти наверняка эта ошибка будет искажена другими ошибками в вашей симуляции. Не беспокойтесь!

Ответ 2

Обратите внимание, что numpy.random.rand позволяет сгенерировать несколько выборок из равномерного распределения при одном вызове:

>>> np.random.rand(5)
array([ 0.69093485,  0.24590705,  0.02013208,  0.06921124,  0.73329277])

Он также позволяет создавать образцы в заданной форме:

>>> np.random.rand(3,2)
array([[ 0.14022471,  0.96360618], 
       [ 0.37601032,  0.25528411], 
       [ 0.49313049,  0.94909878]])

Как вы сказали, равномерно распределенные случайные числа между [-1, 1) могут быть сгенерированы с помощью:

>>> 2 * np.random.rand(5) - 1
array([ 0.86704088, -0.65406928, -0.02814943,  0.74080741, -0.14416581])

Ответ 3

Из документации для numpy.random.random_sample:

Результаты взяты из "непрерывного равномерного" распределения за указанный интервал. Чтобы пробовать Unif [A, b), b > умножить вывод random_sample на (b-a) и добавить a:

 (b - a) * random_sample() + a

Per Sven Marnach отвечает, документация, вероятно, нуждается в обновлении для ссылки numpy.random.uniform.