Python 生成大小为n、平均值为20、最小值为2、最大值为25的整数列表,单位为numpy

Python 生成大小为n、平均值为20、最小值为2、最大值为25的整数列表,单位为numpy,python,numpy,Python,Numpy,我想生成一个大小为n的整数列表,平均值=20,最小值=2,最大值=25 并尝试了以下代码。这非常耗时 # generate service time with mean = 20, min = 2 and max = 25 def gen_avg(n, expected_avg=20, a=2, b=25): while True: l = np.random.randint(a, b, size=n) avg = np.mean(l)

我想生成一个大小为n的整数列表,平均值=20,最小值=2,最大值=25

并尝试了以下代码。这非常耗时

# generate service time with mean = 20, min = 2 and max = 25
def gen_avg(n, expected_avg=20, a=2, b=25):
    while True:
        l = np.random.randint(a, b, size=n)
        avg = np.mean(l)

        if avg == expected_avg:
            return l

请用一些快速的方法帮助我

你可以生成一个随机列表,然后通过替换大于平均值的数字(如果当前平均值太低)或替换小于平均值的数字(如果当前平均值太高)来稍微调整数字,就像这样

def gen平均值(n,预期平均值=20,a=2,b=25):
l=np.random.randint(a,b,size=n)
尽管如此:
如果np.平均值(l)=预期平均值:
打破
而np.平均值(l)>预期平均值:
c=np.random.choice(np.where(l>expected_avg)[0])
l[c]=np.random.randint(a,预期平均值+1)
而np.平均值(l)<预期平均值:

c=np.random.choice(np.where(l您可以生成一个随机列表,然后通过替换大于平均值(如果当前平均值太低)的数字或替换小于平均值(如果当前平均值太高)的数字来稍微调整数字,如是

def gen平均值(n,预期平均值=20,a=2,b=25):
l=np.random.randint(a,b,size=n)
尽管如此:
如果np.平均值(l)=预期平均值:
打破
而np.平均值(l)>预期平均值:
c=np.random.choice(np.where(l>expected_avg)[0])
l[c]=np.random.randint(a,预期平均值+1)
而np.平均值(l)<预期平均值:

c=np.random.choice(np.where)(l如果你的平均值不等于你的(max+min)/2,这意味着你不想要一个均匀分布。那么你必须指定其他分布。你想从哪个分布生成样本?请注意,这样的列表必须至少有5个元素(否则无法达到目标最小值、最大值和平均值)。表格
[2,25,25,25,23,20,20,20,…]
的列表将起作用(根据您需要使用多个
20
s来填充长度
n
),但我想这不是你想要的。你还有什么其他要求吗?@MarkDickinson,说得好,我想这就是答案!@MarkDickinson我想要单峰的distribution@AKareem我想要单峰分布或近似正态分布,因为你的平均值不等于你的(最大+最小)/2这意味着您不需要统一的分布。然后您必须指定其他分布。您希望从哪个分布生成样本?请注意,这样的列表必须至少包含5个元素(否则无法实现目标最小值、最大值和平均值)。表单的列表
[2、25、25、23、20、20、20、…]
会起作用(根据需要使用多达20个
s的pad来获得长度
n
),但我想这不是你想要的。你还有什么其他要求吗?@MarkDickinson,说得好,我想这就是答案!@MarkDickinson我想要单峰的distribution@AKareem我想要单峰分布或近似正态分布
def gen_avg(n, expected_avg=20, a=2, b=25):
    l = np.random.randint(a, b, size=n)
    while True:
        if np.mean(l) == expected_avg:
            break
        while np.mean(l) > expected_avg:
            c = np.random.choice(np.where(l>expected_avg)[0])
            l[c] = np.random.randint(a, expected_avg+1)
        while np.mean(l) < expected_avg:
            c = np.random.choice(np.where(l<expected_avg)[0])
            l[c] = np.random.randint(expected_avg, b)
        return l