这是链接Generate multiple random numbers to equal a value in python的后续问题
在此问题中,我使用了Dickinson博士给出的代码来生成其和=固定数N的随机数。但是,我在该问题中还有其他限制。生成的每个数字都必须在其名义(原始)值的50%以内。例如,如果5个数字的标称值{x1,x2,x3,x4,x5} = {100,100,50,150,100},则x1可以在(50,150)之内变化,x2可以在(50,150)之内变化,x3可以在(50,150)之内变化(25,75)等。但是,x1 + x2 + x3 + x4 + x5的总和=固定数N。
为此,我添加了以下代码。
import random
import numpy as np
import matplotlib.mlab as mlab
import matplotlib.pyplot as plt
def constrained_sum_sample_pos(n, total):
dividers = sorted(random.sample(range(1, total), n - 1))
return [a - b for a, b in zip(dividers + [total], [0] + dividers)]
nominal = [100,100,50,150,100]
count=0
l=[]
for x in range(1,10000):
tempValue = np.asarray(constrained_sum_sample_pos(5, 500))
temp = np.divide(np.absolute(nominal - tempValue), nominal)
if (temp <= 0.5).all():
l.append(tempValue)
count = count + 1
print(np.asarray(l))
finalArray = np.asarray(l)
print(finalArray)
np.savetxt('file1.txt', finalArray,'%5.2f')
print(len(l))
print(np.amax(finalArray,axis=0))
print(np.amin(finalArray,axis=0))
n, bins, patches = plt.hist(finalArray[:,0], 5, facecolor='blue', alpha=0.5)
plt.show()
n, bins, patches = plt.hist(finalArray[:,1], 5, facecolor='blue', alpha=0.5)
plt.show()
n, bins, patches = plt.hist(finalArray[:,2], 5, facecolor='blue', alpha=0.5)
plt.show()
n, bins, patches = plt.hist(finalArray[:,3], 5, facecolor='blue', alpha=0.5)
plt.show()
n, bins, patches = plt.hist(finalArray[:,4], 5, facecolor='blue', alpha=0.5)
plt.show()
基本上,这是使用constrained_sum_sample_pos(n, total):
函数对数字进行采样,然后检查每个数字是否满足约束。如果不是,则数字被拒绝。我有两个问题:
我看了Dirichlet分布,但是我不明白如何实现附加约束。