【问题标题】:Generating fixed length sequence of numbers bounded by k that add up to n生成以 k 为界且加起来为 n 的固定长度数字序列
【发布时间】:2018-07-06 14:04:44
【问题描述】:

给定正整数lkn,我有兴趣编写一个函数f(l, k, n),它返回一个随机生成的长度为l-k, -k + 1, ..., -1, 0, 1, ..., k - 1, k 中整数序列,加起来为n.

任何想法如何实现这一目标?

编辑:允许重复。理想情况下,解决方案集上的概率分布是均匀的,但我并不十分担心:我更感兴趣的是每次调用函数时都获得一个唯一的解决方案。

【问题讨论】:

  • 你有没有尝试过?
  • 您必须更具体地说明“随机”的含义。可以想出一个简单的解决方案,随机选择两个数字,第三个使总和 n,其余的 l-3 等于 0。
  • @RoryDaulton 允许重复。理想情况下,概率分布是均匀的,但我并不十分担心:我对每次运行它时获得唯一序列更感兴趣。如果没有这样的序列是可能的,该函数应该返回 None - 尽管我计划使用值 l、k 和 n,但总会有多个解决方案。
  • FWIW 这个问题似乎与多变量中的线性丢番图方程和子集和问题有关;对这些术语进行网络搜索会找到许多资源。关于生成随机解决方案,如何首先解决 -1 和 1 之间的非整数问题,然后重新缩放并取整数部分并调整结果以相加为 n。
  • @RoryDaulton 实际上,这个问题可以归结为另一个问题。如果您正在寻找一个序列 x_1, x_2, ..., x_l 加起来为 n 且 -k

标签: python algorithm math random integer


【解决方案1】:

既然你已经澄清了你的问题,我可以给你一个答案。但是,由于您还没有展示您自己的任何作品,所以我只是给您一些想法和一个整体的高级算法。如果您想了解更多详细信息,请先展示您自己的一些作品。

正如我在评论中暗示的那样,可能没有可能的所需顺序。例如,不可能从-2, -1, 0, 1, 2 中得到一系列3 数字加起来为7。你应该先检查一下。即使有可能的序列,也可能对序列中的第一个数字有限制。如果您希望-2, -1, 0, 1, 2 中的3 数字序列加起来为5,则第一个数字不能是-2。你的第一个号码的最小值是1,最大值是2

所以这是一个算法,在您初步检查任何序列都是可能的之后。找出序列中第一个数字的最小和最大可能值。在这两个值之间选择一个随机数——使用random 模块中的randintrandrange。然后从n 的值中减去该数字,并从k 中减去1(序列中仍需要的数字计数)。重复这个直到序列完成(仍然需要的数字计数为零)。

这不会以均匀的概率选择所有这样的序列,但每个这样的序列都是可能的。您可以通过在最后的序列上执行shuffle 来平衡概率。可以进行一些小的优化,但我解释的方式很简单。

【讨论】:

    猜你喜欢
    • 2018-04-17
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多