首页 >后端开发 >Python教程 >如何生成等概率地求和到预定义值的随机数?

如何生成等概率地求和到预定义值的随机数?

Susan Sarandon
Susan Sarandon原创
2024-10-27 05:14:02303浏览

How to Generate Random Numbers Summing to a Predefined Value with Equal Probability?

生成与预定义值求和的随机数

在这种情况下,我们的目标是生成一个伪随机数列表,这些伪随机数共同添加直至特定的预定值。一种方法是随机生成指定范围内的数字,将其从总数中减去,然后重复此过程,直到总和等于所需值。然而,这种方法在对总和的贡献方面有利于第一个生成的数字。

为了确保一致性,我们开发了一个更复杂的解决方案:

<code class="python">import random

def constrained_sum_sample_pos(n, total):
    """Return a randomly chosen list of n positive integers summing to total.
    Each such list is equally likely to occur."""

    dividers = sorted(random.sample(range(1, total), n - 1))
    return [a - b for a, b in zip(dividers + [total], [0] + dividers)]</code>

此方法生成一个列表总和为目标值的正整数。关键概念是每种可能的数字组合都有相同的可能性生成。此外,将此技术扩展到不同的总计和不同数量的随机数非常简单。

例如,如果我们将 n 设置为 4,总计设置为 40,我们可能会获得以下输出:[4, 4, 25 ,7]。需要注意的是,此列表中的每个元素相加后都会生成预定义值 40。

为了允许非正整数,可以进行修改:

<code class="python">def constrained_sum_sample_nonneg(n, total):
    """Return a randomly chosen list of n nonnegative integers summing to total.
    Each such list is equally likely to occur."""

    return [x - 1 for x in constrained_sum_sample_pos(n, total + n)]</code>

通过将每个值加一,我们可以生成一个非负整数列表,加起来等于所需的总数。

此方法确保每种可能的组合,无论数字是正数还是非负数,产生的概率相等。凭借其用户友好的实现和跨不同场景的多功能性,constrained_sum_sample_pos 和 constrained_sum_sample_nonneg 已成为 Python 中随机数生成任务不可或缺的一部分。

以上是如何生成等概率地求和到预定义值的随机数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn