给出正整数l
,k
和n
,我对编写函数f(l, k, n)
感兴趣,该函数返回随机生成的长度为l
的序列-k, -k + 1, ..., -1, 0, 1, ..., k - 1, k
中的整数,总计为n
。
有什么想法可以实现这一目标吗?
编辑:允许重复。理想情况下,解决方案集上的概率分布应该是均匀的,但我对此并不十分担心:每次调用函数时,我对获得唯一解决方案都比较感兴趣。
答案 0 :(得分:0)
现在您已经澄清了问题,我可以给您答案。但是,由于您仍然没有展示自己的作品,因此,我仅向您提供一些想法和总体的高级算法。如果您想了解更多细节,请首先展示一些您自己的作品。
正如我在评论中所暗示的,可能是没有可能的所需顺序。例如,不可能从3
获得-2, -1, 0, 1, 2
的数字序列来累加7
。您应该先检查一下。即使存在可能的序列,序列中的第一个数字也可能有限制。如果要将3
中的-2, -1, 0, 1, 2
个数字序列加起来5
,则第一个数字不能为-2
。那么,第一个数字的最小值为1
,最大值为2
。
因此,这是一种算法,在您初步检查所有序列是否可能之后。找到序列中第一个数字的最小和最大可能值。在这两个值之间选择一个随机数-使用randint
模块中的randrange
或random
。然后从您的n
值中减去该数字,并从1
中减去k
(序列中仍需要的数字计数)。对此进行迭代,直到序列完成(仍需要的数字为零)。
这不会以统一的概率选择所有这样的序列,但是每个这样的序列都是可能的。您可以通过对序列的末尾执行shuffle
来对概率进行某种程度的均衡。有一些小的优化可以完成,但是我的解释很简单。