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 ))