在约束中生成多个随机数以等于python中的值

时间:2019-03-05 03:16:19

标签: python

这是链接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):函数对数字进行采样,然后检查每个数字是否满足约束。如果不是,则数字被拒绝。我有两个问题:

  1. 有没有更简单的方法?
  2. 生成的此类数字的分布是什么?

我看了Dirichlet分布,但是我不明白如何实现附加约束。

0 个答案:

没有答案