Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/313.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_Statistics - Fatal编程技术网

Python 常和加权随机数数组

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变量的线性丢番图方程。要

有没有什么著名的算法可以生成具有相同常量和的加权随机数数组

这个问题可以用另一种方式来描述:比如说,我的总值是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
变量的线性丢番图方程。要在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)