Python:在两个值之间生成n个随机整数,求和为给定的数字

Python:在两个值之间生成n个随机整数,求和为给定的数字,python,random,integer,Python,Random,Integer,我非常想在两个值(min,max)之间生成n随机整数,其和等于给定的数字m 注意:我在StackOverflow中发现了类似的问题;但是,它们并没有准确地解决这个问题(使用Dirichlet函数,因此数字介于0和1之间) 示例:我需要8个介于0和24之间的随机数(整数),其中生成的8个数之和必须等于24 感谢您的帮助。谢谢。这是一个基于答案的可能解决方案。看来dirichlet方法只在0和1之间起作用。最初的答案应该是完全正确的。一旦你评论说它达到了你的目的,我很乐意删除它 别忘了对原来的答案投

我非常想在两个值(
min
max
)之间生成
n
随机整数,其和等于给定的数字
m

注意:我在StackOverflow中发现了类似的问题;但是,它们并没有准确地解决这个问题(使用
Dirichlet
函数,因此数字介于0和1之间)

示例:我需要8个介于0和24之间的随机数(整数),其中生成的8个数之和必须等于24


感谢您的帮助。谢谢。

这是一个基于答案的可能解决方案。看来
dirichlet
方法只在0和1之间起作用。最初的答案应该是完全正确的。一旦你评论说它达到了你的目的,我很乐意删除它

别忘了对原来的答案投赞成票

target = 24

x = np.random.randint(0, target, size=(8,))
while sum(x) != target: 
    x = np.random.randint(0, target, size=(8,))

print(x)
# [3 7 0 6 7 0 0 1]

好的,你可以使用整数分布,它自然地和一些固定的数字1相加

只要前后移动,它就会自动工作

代码

这是一个很好的例子。这是解决办法

def partition(n,k,l, m):
    if k < 1:
        raise StopIteration
    if k == 1:
        if n <= m and n>=l :
            yield (n,)
        raise StopIteration
    for i in range(l,m+1):
        for result in partition(n-i,k-1,i,m):                
            yield result+(i,)

n = 24 # sum value
k = 8 # partition size
l = 0 # range min value
m = 24 # range high value 

result = list(partition(n,k,l,m ))
def分区(n,k,l,m):
如果k<1:
提出停止迭代
如果k==1:
如果n=l:
产量(n,)
提出停止迭代
对于范围内的i(l,m+1):
对于分区中的结果(n-i,k-1,i,m):
收益率结果+(i,)
n=24#和值
k=8#分区大小
l=0#范围最小值
m=24#范围高值
结果=列表(分区(n,k,l,m))
这将给出满足条件的所有组合。
ps这相当慢,因为它给出了该分区大小的所有情况。

到目前为止您尝试了什么?如果我们有事情要做,也许我们可以帮上忙……这可不是“随机的”。你的意思是找到从0到24加起来的所有8个整数集,然后随机选择其中一个?(如果是这样的话,第一部分有点有趣,第二部分很琐碎,所以基本上可以归结为第一部分。)阅读和Wiki链接以获得算法你可以使用多项式式的分区问题是,它几乎没有随机性。@SeverinAppadeux是的,这是真的。但随机性不是分区的子集吗?在分区的子集中,生成的第一个分区试图找出条件是否发生了?一个随机的例子可能是这样的。如果你想让它看起来像随机的,你必须在Generator上添加一些类似Fisher Yates shuffle的东西。这正是我想要的。谢谢
def partition(n,k,l, m):
    if k < 1:
        raise StopIteration
    if k == 1:
        if n <= m and n>=l :
            yield (n,)
        raise StopIteration
    for i in range(l,m+1):
        for result in partition(n-i,k-1,i,m):                
            yield result+(i,)

n = 24 # sum value
k = 8 # partition size
l = 0 # range min value
m = 24 # range high value 

result = list(partition(n,k,l,m ))