首页 > 解决方案 > 如何将一个数字分成多个部分(不相等)以使总和等于输入?

问题描述

我想将一个数字(例如输入数字,即 40)划分为从一个范围内随机选择的不同令牌(30 个部分)数字,它们的总和必须等于输入数字,即 40。 编辑: 最大范围应为 40%,最小值应为 0 .

例子:

range = (0,4)

1+1+0+1+1+0+3+0+3+0+0+2+0+4+4+1+1+0+1+1+0+3+0+4+0+2+2+0+4+1 = 40.

实际上在现实世界中显示场景的结果我有一个产品用户表达式的总和,我需要将它们随机填充到上个月每一天的记录集中。我正在使用 php 但无法让算法处理这种情况。

标签: algorithm

解决方案


简单的方法利用“试错”方法。适用于合理的小输入值。

注意 - 它可能会在n接近p*maxx. 如果这种情况是可能的,那么分配“洞”而不是“洞”(第二个代码)会更明智

import random

def randparts(n, p, maxx):
    lst = [0] * p
    while n > 0:
        r = random.randrange(p)
        if lst[r] < maxx:
            n -= 1
            lst[r] += 1
    return lst

print(randparts(20, 10, 4))

>>>  [2, 0, 3, 2, 4, 2, 1, 3, 0, 3]

def randparts(n, p, maxx):
    if p * maxx  >=  n * 2:
        lst = [0] * p
        while n > 0:
            r = random.randrange(p)
            if lst[r] < maxx:
                n -= 1
                lst[r] += 1
    else:
        lst = [maxx] * p
        n = maxx * p - n
        while n > 0:
            r = random.randrange(p)
            if lst[r] > 0:
                n -= 1
                lst[r] -= 1
    return lst

print(randparts(16, 10, 4))
print(randparts(32, 10, 4))

>> [2, 0, 0, 3, 4, 0, 0, 3, 2, 2]
>> [3, 4, 4, 4, 4, 0, 3, 3, 4, 3]

推荐阅读