Pythonで与えられた度数分布に従う乱数を生成する方法をご紹介する。
さっそくだが、全コードを以下に記す。


import random
import matplotlib.pyplot as plt

def random_freq_index(freq_list):
    """ 度数分布表から乱数を生成してインデックス番号を返します
    Args:
        freq_list:度数リスト
    Returns:
        リストのインデックス
    """
    total = sum(x for x in freq_list)
    cum_freq = 0
    dis = [cum_freq]
    for x in freq_list:
        cum_freq += x
        dis.append(float(cum_freq) / total)
    r = random.random()
    i = 0
    while dis[i] < r:
        i += 1
    return i - 1

def random_freq(freq_list):
    """ 度数分布表から乱数を生成して[0,1)の数値を返します
    Args:
        freq_list:度数リスト
    Returns:
        [0,1)の数値
    """
    total = sum(x for x in freq_list)
    cum_freq = 0
    dis = [cum_freq]
    for x in freq_list:
        cum_freq += x
        dis.append(float(cum_freq) / total)
    r = random.random()
    i = 0
    while dis[i] < r:
        i += 1
    x0 = 1.0 / len(freq_list)
    return ((r - dis[i - 1]) / (dis[i] - dis[i - 1])) * x0 + (i - 1) * x0

if __name__ == '__main__' :
    indexes = []
    values = []
    for i in range(1000):
        indexes.append(random_freq_index([20, 50, 25, 10, 100]))
        values.append(random_freq([20, 50, 25, 10, 100]))

    agg = [0,0,0,0,0]
    for i in indexes:
        agg[i] += 1
    print(agg)
    plt.hist(values)
    plt.show()

これを適当な名前を付けてファイルに保存して実行すると、


[99, 254, 139, 50, 458]

となり大体[20,50,25,10,100]の割合となっていることが分かる。また、表示されるヒストグラムは以下のようになる。

python-random-number-generator-frequency-table-example

関連する記事

  • R実装と解説 対応のない2標本の母平均の差の検定(母分散が等しい) [latexpage] 母分散が等しい場合の対応のない2標本の母平均の差の検定とは、2つの母集団が正規分布に従い、ともに母分散が等しいと仮定できるとき、一方の母平均が他方の母平均と「異なる」または「大きい」、「小さい」かどうかを、検定統計量がt分布に従うことを利用して検定します。 統計的検定の流れ 検定の大まかな流れを確認しておきます。 […]
  • Ubuntu 日本語形態素解析システムJUMANのインストール方法Ubuntu 日本語形態素解析システムJUMANのインストール方法 buntu14.04で日本語形態素解析システムJUMANのインストール方法をお伝えする。 JUMAN単体では次のコマンドで簡単にインストールできる。 $ sudo apt-get install […]
  • Ubuntu Server 20.04にOpalをインストールする方法Ubuntu Server 20.04にOpalをインストールする方法 Ubuntu Server […]
  • R言語 CRAN Task View:空間データの分析R言語 CRAN Task View:空間データの分析 CRAN Task View: Analysis of Spatial Dataの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Roger Bivand Contact: Roger.Bivand at […]
  • 地図で見る石川県金沢市の施設分布地図で見る石川県金沢市の施設分布 石川県金沢市にある施設を地図上にプロットしたものをご紹介する。現在、コンビニ、スーパーマーケット、美容院・理容院、病院および診療所の診療科別の分布だけ載せているが今後拡充していく予定である。エリアマーケティングなどの参考にしていただければ幸いだ。 コンビニ スーパーマーケット 洗濯・理容・美容・浴場業 美容院・理容院 エステサロン ネイルサロン […]
Python 度数分布表から乱数を生成する