当前位置: 首页 > 知识库问答 >
问题:

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

鲁羽
2023-03-14

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

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

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

感谢您的帮助。谢谢

共有3个答案

楚威
2023-03-14

这是一个基于这个答案的可能解决方案。看来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]
屠锐
2023-03-14

这是分区数理论的一个例子。这是解决办法

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

这将给出满足条件的所有组合。ps这相当慢,因为它给出了分区大小的所有情况。

林绪
2023-03-14

你可以使用整数分布,它自然地和一些固定数-多项式。

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

密码

import numpy as np

def multiSum(n, p, maxv):
    while True:
        v  = np.random.multinomial(n, p, size=1)
        q  = v[0]
        a,  = np.where(q > maxv) # are there any values above max
        if len(a) == 0: # accept only samples below or equal to maxv
            return q

N = 8
S = 24
p = np.full((N), 1.0/np.float64(N))

mean  = S / N
start = 0
stop  = 24
n = N*mean - N*start

h = np.zeros((stop-start), dtype=np.int64)
print(h)
for k in range(0, 10000):
    ns = multiSum(n, p, stop-start) + start # result in [0...24]
    #print(np.sum(ns))
    for v in ns:
        h[v-start] += 1

print(h)
 类似资料:
  • 问题内容: 我想知道如何在两个给定值之间生成一个随机数。 我可以使用以下内容生成一个随机数: 但是,如何生成0到100(含)之间的随机数? 问题答案: 你可以使用例如 r.nextInt(101) 对于更通用的“在两个数字之间”,请使用: 这会为你提供介于10(含)和100(不含)之间的随机数

  • 第一次在StackOverflow。我希望有人能帮我搜索一个算法。 我需要在给定的范围内生成N个随机数,求和到给定的和! null 可以生成N个常数和的数,解模,像这样:生成和是常数的随机数,但我不能用范围来完成。 或者通过产生N个随机值,将它们求和,然后将常数和除以随机和,然后将每个随机数乘以这个商,就像这里提出的那样。 我不能采用这些解决方案的主要问题是,我的每个随机值都有不同的范围,我需要这

  • 问题内容: 有没有一种方法可以在JavaScript中生成指定范围内的随机数(例如1到6:1、2、3、4、5或6)? 问题答案: 重要 以下代码仅在最小值为时才有效。不适用于除以外的最小值。 如果要获得1( 且只有1 )和6 之间的随机整数,则应计算: 哪里: 1是起始号码 6是可能的结果数(1 +开始 (6) -结束 (1) )

  • 这个问题以前也有人问过,但我从来没有真正看到过好的答案。 > 我想生成8个和为0.5的随机数。 我希望每个数字都是从一个均匀分布中随机选择的(即下面的简单函数将不起作用,因为数字将不是均匀分布的)。 代码应该是可推广的,这样您就可以生成N个和M(其中M是正浮点)的均匀随机数。如果可能的话,能否也请你解释一下(或用一个图表示)为什么你的解会在适当的范围内均匀地产生随机数? 失手的相关问题: 在pyt

  • 本文向大家介绍C#实现在两个数字之间生成随机数的方法,包括了C#实现在两个数字之间生成随机数的方法的使用技巧和注意事项,需要的朋友参考一下 本文介绍一个小编自己写的C#函数,它用于生成两个数之间的一个随机数。 在C#中有一个Random类,使用它可以很方便的生成随机数。其实一个最重要的生成方式就是给它一个最大值和一个最小值,系统可以自动生成该范围内的一个随机数字。 在创建Random对象的时候,需

  • 我试图生成8个范围内的随机数,例如1到100。我生成的很好,但我需要生成随机数,所有生成的随机数和最小-最大范围值之间的特定差异被排除。假设在1到100中,我必须生成2,12,22,32,42,52,62,72的数字。不管怎样,我都可以生成这样的随机数。 提前谢谢。