algorithm - 如何将一个数字分成多个部分(不相等)以使总和等于输入?
问题描述
我想将一个数字(例如输入数字,即 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 但无法让算法处理这种情况。
解决方案
简单的方法利用“试错”方法。适用于合理的小输入值。
注意 - 它可能会在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]
推荐阅读
- google-ads-api - API 中的广告系列统计信息与 GAds 界面中的统计信息不同
- html - 当元素的大小小于严格使用 CSS 的某个值时,可以自动隐藏元素吗?
- reactjs - 我想使用 useEffect 在我的 React 应用程序中设置本地存储
- python - 比较两个数据框列并找到字符串相似之处
- android - Flutter 在 App Idle 或 Inactive 时检索 Socket 消息
- python - 如何将项目附加到字典中的列表?
- python - 提高python算法的速度
- javascript - 使用 WooCommerce,我希望在客户单击产品价格中的“库存”时隐藏/禁用产品属性“颜色部分”并了解如何
- reactjs - 渲染 Markdown 博客文本的 Django-React 博客文章问题
- sql - 如何通过分组数据返回唯一行