首頁  >  文章  >  後端開發  >  如何產生等概率地求和到預定義值的隨機數?

如何產生等概率地求和到預定義值的隨機數?

Susan Sarandon
Susan Sarandon原創
2024-10-27 05:14:02197瀏覽

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