ホームページ >バックエンド開発 >Python チュートリアル >均一な分布が保証された固定和の乱数を生成するにはどうすればよいですか?

均一な分布が保証された固定和の乱数を生成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 10:50:30772ブラウズ

How to Generate Random Numbers with a Fixed Sum, Guaranteed Uniform Distribution?

合計が固定された乱数の生成

提示された課題は、合計が事前定義された値に等しい一連の擬似乱数を生成することです。 。具体的には、足すと 40 になる 4 つの数値を生成する方法です。

最初の数値の分布に偏りをもたらす可能性のある方法に依存する代わりに、より均一なアプローチが採用されています。この解決策は、ランダムに選択された分割器を使用して、事前定義された値をより小さなセグメントに分割する戦略を利用します。

0

a = e
b = f - e
c = g - f
d = 40 - g

この手法では、数値の各セットの確率が等しいことが保証され、均一な分布が保証されます。結果として得られる乱数は、事前定義された値に合計するという要件を満たしています。

この概念を拡張して、次の Python 関数は、合計が指定された合計になる正の整数のランダムなリストを生成します。

<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>

非負の整数を生成するには、追加の変換が使用されます:

<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>

以上が均一な分布が保証された固定和の乱数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。