Python:具有均值和标准差的随机数生成器

Mer*_*ht2 8 python

我需要知道如何在Python 500和600,有一个平均= 550,标准差= 30之间产生1000张随机数.

import pylab
import random

xrandn = pylab.zeros(1000,float)

for j in range(500,601):
xrandn[j] = pylab.randn()

???????
Run Code Online (Sandbox Code Playgroud)

ely*_*ase 9

您正在寻找stats.truncnorm:

import scipy.stats as stats

a, b = 500, 600
mu, sigma = 550, 30
dist = stats.truncnorm((a - mu) / sigma, (b - mu) / sigma, loc=mu, scale=sigma)

values = dist.rvs(1000)
Run Code Online (Sandbox Code Playgroud)

  • 嗯.这是方差的正确参数化吗?结果`values.std()`似乎是〜23.87而不是30. (4认同)

jde*_*esa 5

您的问题还有其他选择。Wikipedia有一个有界间隔连续分布列表,根据分布,您也许可以使用正确的参数获得所需的特征。例如,如果您想要“有界高斯钟形”(不被截断)之类的东西,则可以选择(缩放的)beta分布

import numpy as np
import scipy.stats
import matplotlib.pyplot as plt

def my_distribution(min_val, max_val, mean, std):
    scale = max_val - min_val
    location = min_val
    # Mean and standard deviation of the unscaled beta distribution
    unscaled_mean = (mean - min_val) / scale
    unscaled_var = (std / scale) ** 2
    # Computation of alpha and beta can be derived from mean and variance formulas
    t = unscaled_mean / (1 - unscaled_mean)
    beta = ((t / unscaled_var) - (t * t) - (2 * t) - 1) / ((t * t * t) + (3 * t * t) + (3 * t) + 1)
    alpha = beta * t
    # Not all parameters may produce a valid distribution
    if alpha <= 0 or beta <= 0:
        raise ValueError('Cannot create distribution for the given parameters.')
    # Make scaled beta distribution with computed parameters
    return scipy.stats.beta(alpha, beta, scale=scale, loc=location)

np.random.seed(100)

min_val = 1.5
max_val = 35
mean = 9.87
std = 3.1
my_dist = my_distribution(min_val, max_val, mean, std)
# Plot distribution PDF
x = np.linspace(min_val, max_val, 100)
plt.plot(x, my_dist.pdf(x))
# Stats
print('mean:', my_dist.mean(), 'std:', my_dist.std())
# Get a large sample to check bounds
sample = my_dist.rvs(size=100000)
print('min:', sample.min(), 'max:', sample.max())
Run Code Online (Sandbox Code Playgroud)

输出:

import numpy as np
import scipy.stats
import matplotlib.pyplot as plt

def my_distribution(min_val, max_val, mean, std):
    scale = max_val - min_val
    location = min_val
    # Mean and standard deviation of the unscaled beta distribution
    unscaled_mean = (mean - min_val) / scale
    unscaled_var = (std / scale) ** 2
    # Computation of alpha and beta can be derived from mean and variance formulas
    t = unscaled_mean / (1 - unscaled_mean)
    beta = ((t / unscaled_var) - (t * t) - (2 * t) - 1) / ((t * t * t) + (3 * t * t) + (3 * t) + 1)
    alpha = beta * t
    # Not all parameters may produce a valid distribution
    if alpha <= 0 or beta <= 0:
        raise ValueError('Cannot create distribution for the given parameters.')
    # Make scaled beta distribution with computed parameters
    return scipy.stats.beta(alpha, beta, scale=scale, loc=location)

np.random.seed(100)

min_val = 1.5
max_val = 35
mean = 9.87
std = 3.1
my_dist = my_distribution(min_val, max_val, mean, std)
# Plot distribution PDF
x = np.linspace(min_val, max_val, 100)
plt.plot(x, my_dist.pdf(x))
# Stats
print('mean:', my_dist.mean(), 'std:', my_dist.std())
# Get a large sample to check bounds
sample = my_dist.rvs(size=100000)
print('min:', sample.min(), 'max:', sample.max())
Run Code Online (Sandbox Code Playgroud)

概率密度函数图:

概率密度函数

请注意,界限不是每个可能的组合,平均值和标准偏差将产生一个有效的分配在这种情况下,虽然,根据得到的值alphabeta概率密度函数可能看起来像一个“倒钟”,而不是(即使均值标准偏差仍然是正确的)。