Python中平均值已知时的随机数生成器
在Python中,我试图得到一个列表,其中10个随机数介于[0100]之间,平均值为25。我所有的信息都在下面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
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之间生成,而第二个随机数依赖于第一个随机数
我的方法的一个缺点是,它不处理奇数个随机数 以下是两个限制条件:
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