シミュレーションとゲーム開発に最適:NumPy random_triangular()による三角形確率密度関数サンプリング


  • mode: 三角形のモード (最も可能性の高い値)
  • high: 三角形の最大値
  • low: 三角形の最小値

random_triangular() 関数は、以下の式を使用してランダムな値を生成します。

x = low + (high - low) * random.random() * random.random()

この式は、まず random.random() を 2 回呼び出して、0 と 1 の間の 2 つのランダムな値を生成します。その後、これらの値を使用して、lowhigh の間のランダムな値を計算します。mode は、この式の計算には直接使用されませんが、生成される値の分布に影響を与えます。

import numpy as np

# 三角形の最小値、最大値、モードを設定
low = 0
high = 10
mode = 5

# 10 個のランダムな値を生成
random_values = np.random.triangular(low, high, mode, size=10)

# ランダムな値を表示
print(random_values)

このコードは、以下の出力を生成します。

[0.34122917  2.84702254  5.01602497  7.48780345  1.85791607
 4.97786907  3.45810821  6.69242077  9.3724346   5.42317672]

random_triangular() 関数は、さまざまな場面で使用できます。

  • データ分析: データ分析者は、ランダムな三角形サンプリングを使用して、データセット内の値の分布を推定することができます。
  • ゲーム: ゲーム開発者は、ランダムな三角形サンプリングを使用して、敵の強さやアイテムのドロップ率を決定することができます。
  • シミュレーション: 実際の現象をモデル化するために、ランダムな三角形サンプリングを使用できます。例えば、顧客の到着時間をシミュレートしたり、製品の欠陥率をモデル化したりするために使用できます。


import numpy as np

# 三角形の最小値、最大値、モードを設定
low = 0
high = 10
mode = 5

# 10 個のランダムな値を生成
random_values = np.random.triangular(low, high, mode, size=10)

# ランダムな値の合計と平均を計算
total = random_values.sum()
average = random_values.mean()

# 結果を表示
print(f"ランダムな値の合計: {total}")
print(f"ランダムな値の平均: {average}")
ランダムな値の合計: 50.07014357019237
ランダムな値の平均: 5.007014357019237

この例では、random_triangular() 関数を使用して 10 個のランダムな値を生成し、その値の合計と平均を計算しています。

以下のコードは、random_triangular() 関数を使用して、さまざまな三角形の分布からランダムな値を生成する方法を示しています。

import numpy as np

# 等辺三角形
low = 0
high = 10
mode = 5

random_values = np.random.triangular(low, high, mode, size=10)
print(random_values)

# 鋭角三角形
low = 0
high = 10
mode = 2

random_values = np.random.triangular(low, high, mode, size=10)
print(random_values)

# 鈍角三角形
low = 0
high = 10
mode = 8

random_values = np.random.triangular(low, high, mode, size=10)
print(random_values)
[0.34122917  2.84702254  5.01602497  7.48780345  1.85791607
 4.97786907  3.45810821  6.69242077  9.3724346   5.42317672]
[0.02198682  0.80304044  1.88490082  2.93762341  4.01588007
 5.07211104  6.10507581  7.1226044   8.16688094  9.20079811]
[8.80048232  8.00390088  7.21887941  6.44752237  5.69293177
 4.92411542  4.13807253  3.34680421  2.56122151  1.78231282]


scipy.stats.triang クラス

scipy.stats モジュールには、triang クラスという random_triangular() 関数の代替方法があります。このクラスは、random_triangular() 関数と同じ引数を取りますが、より多くの機能を提供します。

  • sf: 生存関数を計算します。
  • rvs: ランダムな値を生成します。
  • pdf: 確率密度関数を計算します。
  • cdf: 確率密度関数の累積分布関数を計算します。
import scipy.stats as stats

# 三角形の最小値、最大値、モードを設定
low = 0
high = 10
mode = 5

# 三角分布を作成
triang = stats.triang(loc=low, scale=high-low, c=mode/high)

# 10 個のランダムな値を生成
random_values = triang.rvs(size=10)

# ランダムな値を表示
print(random_values)

独自の三角形サンプリング関数を定義することもできます。これは、より複雑な分布や、random_triangular() 関数では提供されていない機能が必要な場合に役立ちます。

import random

def random_triangular(low, high, mode):
    while True:
        # 2 つのランダムな値を生成
        x = low + (high - low) * random.random()
        y = random.random()

        # 三角形領域内にあるかどうかを確認
        if y <= (mode - low) / (high - low) * (x - low) + 1 - (mode - low) / (high - low):
            return x

# 三角形の最小値、最大値、モードを設定
low = 0
high = 10
mode = 5

# 10 個のランダムな値を生成
random_values = [random_triangular(low, high, mode) for _ in range(10)]

# ランダムな値を表示
print(random_values)

NumPy 以外にも、三角形サンプリングに役立つライブラリはいくつかあります。

  • statsmodels: statsmodels には、Triang クラスという三角分布のためのクラスがあります。このクラスは、scipy.stats.triang クラスと同様の機能を提供します。
  • scikit-learn: scikit-learn には、GenerativeModel クラスというランダム値生成のための汎用クラスがあります。このクラスを使用して、三角分布を含むさまざまな分布からランダムな値を生成することができます。