【问题标题】:Creating an array that adds up to 1 with certain conditions in Python在 Python 中创建一个在特定条件下加起来为 1 的数组
【发布时间】:2021-12-26 02:07:29
【问题描述】:

这是我必须用 Python 解决的问题。

我必须创建一个加起来为 1 的随机数数组。但是,需要考虑一些条件。

  1. 数组中元素的数量是固定的。例如,让我们考虑一个大小为 7 的列表。

  2. 此数组中的某些元素需要高于或低于某个数字。假设第二个元素需要大于 0.4,第三个元素需要小于 0.2,第七个元素需要小于 0.1。

  3. 在第 1 步和第 2 步之后,列表的总和应该是 1。

我不打算选择满足这些条件的结果,而是想为每个已经满足条件的循环创建通用数组。

脚本会告诉我列表应该有多长以及哪些元素需要高于或低于某些值。我可以使用的信息是一个如下所示的数组:

higher_than = 0.4
lower_than_1 = 0.2
lower_than_2 = 0.1

array = [1, 2, 0, 1, 1, 1, 0]

这里的 2 表示生成的权重应该高于“higher_than”。第一个 0 表示结果中的该元素应低于“lower_than_1”,第二个 0 表示结果中的该元素应低于“lower_than_2”。然后,我将使用这些信息来解决上述问题。

我非常想听听您对该问题的见解和解决方案。提前谢谢你。

【问题讨论】:

    标签: python arrays algorithm


    【解决方案1】:

    有很多方法可以做到这一点。这是一个。

    从你比水桶开始。如果您有超过 2 个,则没有解决方案。否则,将地板分配给他们每个人(在您的示例中为 0.4)。

    接下来,将每个存储桶视为有一个上限。给出了低于。对于higher_thans,使用比higher_than少1.0(这里是0.6)。

    记录 rand() * 每个桶的上限。重新调整这些以等于初始分配给higher_than存储桶后剩余的容量,然后完成分配。

    例如,假设我们有两个上限为 0.1、两个上限为 0.2、一个下限为 0.4。

    1. allocate weight to the higher_than bucket.
       weights = [0.0, 0.0, 0.0, 0.0, 0.4] (buckets in order I listed them)
    2. rand() * cap:
       unscaled allocation = [0.73 * 0.1, 0.24 * 0.1, 0.34 * 0.2, 0.87 * 0.2, 0.33 * 0.6] = [0.073, 0.024, 0.068, 0.174, 0.198]
    

    现在缩放有点棘手,因为天真的方法,按期望分配与当前分配的比率缩放所有内容,有超过 lower_than 上限的风险。

    通过将缩放因子应用于 caps 数组来处理此问题 - 未缩放的分配。 IE。 [0.1 - 0.073, 0.1 - 0.024, 0.2 - 0.068, 0.2 - 0.174, 0.6 - 0.198] = [0.027, 0.076, 0.132, 0.026, 0.402]

    我们想用它来缩放未缩放的分配数组,使其总和为 0.6。目前它的总和为 0.537,而 caps_less_allocation 数组的总和为 0.663。我们需要将我们的分配增加 0.6 - 0.537 = 0.063。所以我们将 caps_less_allocation 数组中的所有内容乘以 0.063/0.663,然后将我们的三个数组相加:

    [0.0,     0.0,     0.0,     0.0,     0.4] - initial weight array
    [0.073,   0.024,   0.068,   0.174,   0.198] - unscaled allocation array
    [0.00257, 0.00722, 0.01254, 0.00247, 0.03820] - additive scaling factors (rounded)
    ---------------------------------------------------------------------
    [0.07557, 0.03122, 0.08054, 0.17647, 0.63620] 
    

    现在我们有一个满足我们的约束并且总和为 1.0 的随机数组

    【讨论】:

    • 对于缩放,如果您需要减少而不是增加总数,请直接从未缩放的分配数组中计算缩放因子。
    猜你喜欢
    • 2014-11-08
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2012-06-28
    • 1970-01-01
    相关资源
    最近更新 更多