如何在python中将一个数字随机分成12个,并且所有随机数之和等于该数字

sne*_*ngh 0 python

大家好,我有一个问题,包含任何数字(例如 167)将被分成 12 个随机数,12 个随机数的总和应该是原始数字并且数字是正数,大于零,整数

为此我写了一个代码:

a = 167
n = 12
out = diff([0,sort(randperm(a-1,n-1)),a])
Run Code Online (Sandbox Code Playgroud)

我收到一个错误

名称“diff”未定义

其他方式:

a =  50390
b = rand(10,1)
b  = b/sum(b)*a
out=round(b)
out(1) = out(1) - (a-sum(out))
Run Code Online (Sandbox Code Playgroud)

注意:这两个代码都不起作用,所以请告诉我该怎么做

请帮我得到它..谢谢

geo*_*urb 6

这应该可以做到。

from random import randint
a = 167
n = 12

assert a >= n >= 1

pieces = []
for idx in range(n-1):
    # Number between 1 and a
    # minus the current total so we don't overshoot
    # minus 1 for each number that hasn't been picked
    # so they can all be nonzero
    pieces.append(randint(1,a-sum(pieces)-n+idx))
pieces.append(a-sum(pieces))
Run Code Online (Sandbox Code Playgroud)

请注意,这些数字不是独立的;任何时候添加像 之类的约束THE n VALUES MUST TOTAL a,都会消除一些随机性。在这里,分布中后面的数字可能小于前面的数字,直到最后一个数字预计再次平均。如果您不喜欢这种趋势,您可以查看shuffle()结果列表pieces

编辑:对于浮点数,您不必为下一个值节省空间(对于非负整数而不是正整数也是如此),所以它看起来有点不同。基本上,您只需-n+idx从表达式中删除该术语,因为您不再需要分配n-idx更多 >=1 的块。

from random import uniform
a = 166.667
n = 12

assert a > 0
assert n >= 1

pieces = []
for idx in range(n-1):
    # Number between 0 and a
    # minus the current total so we don't overshoot
    pieces.append(uniform(0,a-sum(pieces)))
pieces.append(a-sum(pieces))
Run Code Online (Sandbox Code Playgroud)