ホームページ  >  記事  >  バックエンド開発  >  等しい確率で事前に定義された値に合計される乱数を生成するにはどうすればよいですか?

等しい確率で事前に定義された値に合計される乱数を生成するにはどうすればよいですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-27 05:14:02197ブラウズ

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

事前定義された値に合計する乱数の生成

このコンテキストでは、集合的に追加する疑似乱数のリストを生成することを目的としています。特定の所定の値まで。 1 つの方法では、指定された範囲内の数値をランダムに生成し、それを合計から減算し、合計が目的の値と等しくなるまでこのプロセスを繰り返します。ただし、このアプローチでは、合計への寄与という点で最初に生成された数値が優先されます。

均一性を確保するために、より洗練されたソリューションが開発されました。

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

By各値を 1 ずつ増分すると、合計が望ましい合計となる負ではない整数のリストを生成できます。

このメソッドでは、数値が正であるか負でないかに関係なく、すべての可能な組み合わせが保証されます。生成される確率は等しい。 constrained_sum_sample_pos と constrained_sum_sample_nonneg は、そのユーザーフレンドリーな実装とさまざまなシナリオにわたる汎用性により、Python の乱数生成タスクに不可欠なものになりました。

以上が等しい確率で事前に定義された値に合計される乱数を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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