Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中平均值已知时的随机数生成器_Python_Random - Fatal编程技术网

Python中平均值已知时的随机数生成器

Python中平均值已知时的随机数生成器,python,random,Python,Random,在Python中,我试图得到一个列表,其中10个随机数介于[0100]之间,平均值为25。我所有的信息都在下面 Total = 250 Number_of_users = 10 Average_score = 25 在过去,我随机使用高斯函数,但没有标准差,我有点卡住了。还有别的方法吗 我的输出类似于: [20, 30, 18, 21, 27, 30, 15, 24, 31, 30] 我有一个想法: import random Number_of_users = 10 Average_sc

在Python中,我试图得到一个列表,其中10个随机数介于[0100]之间,平均值为25。我所有的信息都在下面

Total = 250
Number_of_users = 10
Average_score = 25
在过去,我随机使用高斯函数,但没有标准差,我有点卡住了。还有别的方法吗

我的输出类似于:

[20, 30, 18, 21, 27, 30, 15, 24, 31, 30]
我有一个想法:

import random

Number_of_users = 10
Average_score = 25

index = Number_of_users / 2
result = []

while index:
    index -= 1
    random_number = random.randint(0,51)
    result.append(random_number)
    result.append(50-random_number)

print (result)
print (sum(result))
你将得到5对随机数;对于每对随机数,第一个随机数在0~50之间生成,而第二个随机数依赖于第一个随机数


我的方法的一个缺点是,它不处理奇数个随机数

以下是两个限制条件:

  • 数字是随机的

  • 平均值收敛到25

  • 由于对分布没有约束,实现这一点的一种方法是从两个不同的均匀分布中取样:

    import random
    out_list = []
    for i in range(1,10):
        random_number = random.uniform(0,1)
        if random_number < 0.75:
            # Append uniform random number between 0 - 25 with probability .75
            out_list.append(random.randint(0,25))
        else:
            #Append uniform random number between 0-75 with probability 0.25
            out_list.append(random.randint(25,100))
    
    print(out_list)
    import statistics
    print(statistics.mean(out_list))
    
    随机导入
    out_list=[]
    对于范围(1,10)内的i:
    随机数=随机均匀(0,1)
    如果随机数<0.75:
    #以概率在0-25之间附加均匀随机数。75
    out_list.append(random.randint(0,25))
    其他:
    #附加0-75之间的均匀随机数,概率为0.25
    out_list.append(random.randint(25100))
    打印(输出列表)
    进口统计
    打印(统计。平均值(输出列表))
    

    此外,这个问题可能会在stats.stackexchange.com上找到更好的答案。

    您可以尝试平均值为25的贝塔分布,也就是说,选择a,b参数,使a/(a+b)=0.25。通过改变a、b参数,您可以在下图中了解您想要的方差。


    好吧,如果你想
    ,如果可能的话,总数也将是250
    ,那么答案将是从中取样。根据定义,它将产生随机值,总和为250,平均值为25。如果其中一个数字超过100(这将是非常罕见的),我们将玩接受/拒绝游戏。在NumPy的帮助下

    import numpy as np
    
    Total = 250
    Number_of_users = 10
    Average_score = 25
    Upper_boundary = 100
    
    probs = np.full(10, 1.0/np.float64(Number_of_users), dtype=np.float64) # probabilities
    
    N = 10000 # samples to test
    k = 0
    while k < N:
        q = np.random.multinomial(Total, probs)
        t = np.where(q > Upper_boundary) # check for out-of boundaries
        if np.any(t):
            print("Rejected, out of boundaries") # reject, do another sample
            continue
        # accepted
        # do something with q, print((sum(q), len(q), np.mean(q)))
    
        k += 1
    
    将numpy导入为np
    总数=250
    用户数量=10
    平均分=25分
    上边界=100
    probs=np.full(10,1.0/np.float64(用户数),dtype=np.float64)#概率
    N=10000#待测试样品
    k=0
    当k上#u边界)#检查是否超出边界
    如果np.有(t):
    打印(“拒绝,超出边界”)#拒绝,再做一个样本
    持续
    #接受
    #用q,print做点什么((和(q),len(q),np.mean(q)))
    k+=1
    
    您是否也要求将它们相加到某个给定的数字?是的,因此如果可能,总数也将是250。对于奇数,请在列表中插入一个值25,保持平均值不变。之后,可以通过选择一个随机递增/递减和一对数字,增加一个,减少另一个(注意数字值的限制)来玩列表。这可以重复多次,以彻底混合最终值。这些数字的分布图将是。。。不幸的是,由于缺少更好的wordWell,数字也可能超过100,但不太可能,而且很容易检查。这种方法的真正问题是,10个数字中有9个会有类似于Beta分布的东西,而第10个数字的分布会非常不同。好吧,这就是设置平均值等于任何数字的限制,它会少一个自由度。在这种情况下,任何分布都不准确。
    在这种情况下,任何分布都不准确。
    嗯?!没有道理。有这样的分布,其中整数的deifniton多项式或实数的Dirichlet满足这样的条件,这给出了一个非常优雅的解决方案。
    import numpy as np
    
    Total = 250
    Number_of_users = 10
    Average_score = 25
    Upper_boundary = 100
    
    probs = np.full(10, 1.0/np.float64(Number_of_users), dtype=np.float64) # probabilities
    
    N = 10000 # samples to test
    k = 0
    while k < N:
        q = np.random.multinomial(Total, probs)
        t = np.where(q > Upper_boundary) # check for out-of boundaries
        if np.any(t):
            print("Rejected, out of boundaries") # reject, do another sample
            continue
        # accepted
        # do something with q, print((sum(q), len(q), np.mean(q)))
    
        k += 1