生成以k为界的固定长度的数字序列,这些序列的总和为n

时间:2018-07-06 14:04:44

标签: python algorithm math random integer

给出正整数lkn,我对编写函数f(l, k, n)感兴趣,该函数返回随机生成的长度为l的序列-k, -k + 1, ..., -1, 0, 1, ..., k - 1, k中的整数,总计为n

有什么想法可以实现这一目标吗?

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

1 个答案:

答案 0 :(得分:0)

现在您已经澄清了问题,我可以给您答案。但是,由于您仍然没有展示自己的作品,因此,我仅向您提供一些想法和总体的高级算法。如果您想了解更多细节,请首先展示一些您自己的作品。

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

因此,这是一种算法,在您初步检查所有序列是否可能之后。找到序列中第一个数字的最小和最大可能值。在这两个值之间选择一个随机数-使用randint模块中的randrangerandom。然后从您的n值中减去该数字,并从1中减去k(序列中仍需要的数字计数)。对此进行迭代,直到序列完成(仍需要的数字为零)。

这不会以统一的概率选择所有这样的序列,但是每个这样的序列都是可能的。您可以通过对序列的末尾执行shuffle来对概率进行某种程度的均衡。有一些小的优化可以完成,但是我的解释很简单。