「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > 等しい確率で事前に定義された値に合計される乱数を生成するにはどうすればよいですか?

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

2024 年 11 月 8 日に公開
ブラウズ:741

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

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

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

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

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

このメソッドは、合計がターゲット値になる正の整数のリストを生成します。重要な概念は、考えられるすべての数値の組み合わせが同じように生成される可能性があるということです。さらに、この手法をさまざまな合計やさまざまな数の乱数に拡張することは簡単です。

たとえば、n を 4、合計を 40 に設定すると、次の出力が得られる可能性があります: [4, 4, 25] 、7]。このリストの各要素を合計すると、事前定義された値 40 が生成されることに注意することが重要です。

正以外の整数を許可するには、

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

各値を 1 ずつ増分することで、合計が目的の合計になる負でない整数のリストを生成できます。

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

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3