Python 常和加权随机数数组
有没有什么著名的算法可以生成具有相同常量和的加权随机数数组 这个问题可以用另一种方式来描述:比如说,我的总值是20。应分为3个部分,每个部分的重量分别为2,4,3。 所以,我需要3个随机数,其和为20,但分布将遵循权重 我试过:Python 常和加权随机数数组,python,random,statistics,Python,Random,Statistics,有没有什么著名的算法可以生成具有相同常量和的加权随机数数组 这个问题可以用另一种方式来描述:比如说,我的总值是20。应分为3个部分,每个部分的重量分别为2,4,3。 所以,我需要3个随机数,其和为20,但分布将遵循权重 我试过: Range=20 W=[2,4,3] Prob=[i/float(sum(W)) for i in W] Weighted_array=np.random.multinomial(Range, Prob) 有更好的选择吗?符号: 这是一个n=3变量的线性丢番图方程。要
Range=20
W=[2,4,3]
Prob=[i/float(sum(W)) for i in W]
Weighted_array=np.random.multinomial(Range, Prob)
有更好的选择吗?符号: 这是一个
n=3
变量的线性丢番图方程。要在python中解析地解决此问题,可以使用sympy
,如下所示:
蛮力: 或者,至少对于较小的
n
和每个变量的紧边界,您可以预先计算所有可能的解决方案,并使用random.choice
每次选择一个。例如,我们将所有变量限制为正,然后将它们强制为[0,20/系数]
,只有14个解。我们可以在python中生成以下内容:
import random
import itertools
n = 20
coefficients = [2, 4, 3]
valid_solutions = []
ranges = [range(0, n // k + 1) for k in coefficients]
for value in itertools.product(*ranges):
if sum(value[j] * i for j, i in enumerate(coefficients)) == n:
valid_solutions.append(value)
print("All solutions:")
print("\n".join(str(i) for i in valid_solutions))
print("Random solution:")
print(random.choice(valid_solutions))
这将产生:
All solutions:
(0, 2, 4)
(0, 5, 0)
(1, 0, 6)
(1, 3, 2)
(2, 1, 4)
(2, 4, 0)
(3, 2, 2)
(4, 0, 4)
(4, 3, 0)
(5, 1, 2)
(6, 2, 0)
(7, 0, 2)
(8, 1, 0)
(10, 0, 0)
Random solution:
(10, 0, 0)
我在python中尝试了random.multinomial()。请提供更多详细信息。你的意思是什么类型的数字——只允许正整数,还是允许浮点数?你所说的“分布将跟随重量”是什么意思?对于结果,你想要什么样的概率分布——在所有可能的情况下,某种均匀分布,你不在乎,或者其他什么?很抱歉不清楚。我需要生成整数。例如,加权_数组可以是:[4,10,6],[3,12,5]等。“分布将遵循权重”意味着结果数组元素将根据W数组元素进行加权。希望这能说明问题。但是你有20个潜在的数据样本,只有三个权重。假设我使用你的代码作为一个黑匣子,采样1mln个样本,然后把它们放在直方图中,从1(或者零?有点不清楚)到20。这三个权重将如何体现?非常感谢你的回答。但问题是我需要n个变量的一般解。因为我的数组W可以有100个或更多的元素。因此,我认为丢番图将不是有效的。
All solutions:
(0, 2, 4)
(0, 5, 0)
(1, 0, 6)
(1, 3, 2)
(2, 1, 4)
(2, 4, 0)
(3, 2, 2)
(4, 0, 4)
(4, 3, 0)
(5, 1, 2)
(6, 2, 0)
(7, 0, 2)
(8, 1, 0)
(10, 0, 0)
Random solution:
(10, 0, 0)