Python 随机抽样n个数字,从(x,y)的平均值到k?

Python 随机抽样n个数字,从(x,y)的平均值到k?,python,numpy,random,Python,Numpy,Random,我试图从范围(低=3,高=7)中随机抽取n=15个数字,当对所抽取的15个数字求和时,它们的平均值为5 到目前为止,我只对特定范围内的n个数字进行了随机抽样,如: n = 15 low = 3 high = 8 range=[i for i in range(low,high)] list =np.random.choice(range, n) 这将生成随机的15位整数,范围为3、4、5、6、7。然而,我想要随机抽样,但是n位和的结果平均值等于5?我该怎么办 我不确定这是否适合您的需要,但这

我试图从范围(低=3,高=7)中随机抽取n=15个数字,当对所抽取的15个数字求和时,它们的平均值为5

到目前为止,我只对特定范围内的n个数字进行了随机抽样,如:

n = 15
low  = 3
high = 8
range=[i for i in range(low,high)]
list =np.random.choice(range, n)

这将生成随机的15位整数,范围为3、4、5、6、7。然而,我想要随机抽样,但是n位和的结果平均值等于5?我该怎么办

我不确定这是否适合您的需要,但这是一种方法

import random

def kind_of_random(low, high, k, n):
    """
    Generate a list of n numbers between low and high
    with a mean of exactly k.
    """  
    assert k < high
    values = [low] * n
    to_add = (k - low) * n
    for _ in range(to_add):
        i = random.randint(0, n-1)
        # Don't want to add to a value that's already the max
        while values[i] == high:
            i = random.randint(0, n-1)
        values[i] += 1
    return values

ns = kind_of_random(3, 7, 5, 15)
随机导入
定义随机类型(低、高、k、n):
"""
生成一个由n个介于低和高之间的数字组成的列表
平均值正好是k。
"""  
断言k

我相信这个想法有更有效的变体-我认为你可以通过启动
n*[k]
而不是
n*[low]
并进行一些成对的加法/减法运算来更快地完成它,但这对于较小的
n
来说应该足够了。我不确定这是否适合你的需要,但这是一种方法

import random

def kind_of_random(low, high, k, n):
    """
    Generate a list of n numbers between low and high
    with a mean of exactly k.
    """  
    assert k < high
    values = [low] * n
    to_add = (k - low) * n
    for _ in range(to_add):
        i = random.randint(0, n-1)
        # Don't want to add to a value that's already the max
        while values[i] == high:
            i = random.randint(0, n-1)
        values[i] += 1
    return values

ns = kind_of_random(3, 7, 5, 15)
随机导入
定义随机类型(低、高、k、n):
"""
生成一个由n个介于低和高之间的数字组成的列表
平均值正好是k。
"""  
断言k

我相信这个想法有更有效的变体-我认为你可以通过启动
n*[k]
而不是
n*[low]
并进行一些成对的加法/减法运算来更快地完成它,但这对于较小的
n
来说应该足够了,我们可以使用结果与已知值自然相加的分布,以及 对于固定数量的采样数,平均值也将是固定的。 平均数为5,样本数为15,表示样本总数应始终等于75

最简单的是,让我们从NumPy使用它。我们将等概率设置为1/15,在[0…30]范围内采样,如果任何值高于所需范围,则拒绝采样

它比@jbch提出的方法更快,不需要手动平衡总和和平均数,如果你在意的话,分布直方图更接近对称

代码

我电脑上的典型输出直方图

[15698 38107 44584 33719 17892]
@jbch输出直方图

[17239 39237 42188 28957 22379]

好的,我们可以使用结果自然和已知值相加的分布,并且 对于固定数量的采样数,平均值也将是固定的。 平均数为5,样本数为15,表示样本总数应始终等于75

最简单的是,让我们从NumPy使用它。我们将等概率设置为1/15,在[0…30]范围内采样,如果任何值高于所需范围,则拒绝采样

它比@jbch提出的方法更快,不需要手动平衡总和和平均数,如果你在意的话,分布直方图更接近对称

代码

我电脑上的典型输出直方图

[15698 38107 44584 33719 17892]
@jbch输出直方图

[17239 39237 42188 28957 22379]

你不能两者兼得。如果你随机抽样,你会得到一个随机平均数。你可以想出一个过程来得到你想要的数字,但它不会是一个随机样本。你需要这个干什么?@jbch谢谢你。是的,我意识到如果我修正到某个平均值k,这不是随机的。我试图在给定的范围内进行随机计时,但这些数字似乎是固定的。我想确保数字是在平均k附近采样的,而我有3、4、5、6、7的随机数字,用于以后的列表排列。为了澄清,我认为这个问题可以细化为从平均值为k的范围(x,y)中采样n个数字(因此没有随机采样),你不能同时拥有这两个数字。如果你随机抽样,你会得到一个随机平均数。你可以想出一个过程来得到你想要的数字,但它不会是一个随机样本。你需要这个干什么?@jbch谢谢你。是的,我意识到如果我修正到某个平均值k,这不是随机的。我试图在给定的范围内进行随机计时,但这些数字似乎是固定的。我想确保数字是在平均值k附近采样的,同时我有3、4、5、6、7的随机数字,用于以后的列表排列。为了澄清,我认为这个问题可以细化为从平均值的范围(x,y)中采样n个数字,以表示k(因此没有随机采样),谢谢。这就是我想的!!这不太可能,但从技术上讲,while循环可能是无限的,最好将while循环下的
i=random.randint(0,n-1)
替换为
i+=1
,以确保它不存在。这就是我想的!!不太可能,但从技术上讲,while循环可能是无限的,最好将while循环下的
i=random.randint(0,n-1)
替换为
i+=1
,以确保它不是无限的