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

関連する記事

  • 地図で見る石川県金沢市の人口 2014年1月地図で見る石川県金沢市の人口 2014年1月 金沢市役所が公開している平成26年1月の住民基本台帳人口と総務省統計局が公開している地図データを基に人口、人口密度、世帯数、未成年・高齢者の年齢別などの数値および前年同月からの増減率を地図上に色分けして視覚化したものと上位・下位のランキングをご紹介する。 人口、世帯数などのデータを活用しようと考えた場合、まずは国勢調査を思いつくが、国勢調査は5年ごとに行われており、最近 […]
  • R データフレームから特定の型の列を抽出する方法R データフレームから特定の型の列を抽出する方法 Rのデータフレームから特定の型の列を抽出する方法をお伝えします。 サンプルデータとして、irisを用います。 データフレームの構造をstr関数で確認します。 > str(iris) 'data.frame': 150 obs. of 5 variables: $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 […]
  • QGIS インストールQGIS インストール QGISのインストール方法をご紹介する。Windows版のQGISはインストーラーが用意されているので、非常に簡単にインストールできる。インストールの流れとしては、ウェブサイトからインストーラーをダウンロードして、起動後、画面を確認しながら次へボタンを押していけばよい。インストールが完了したら再起動を促されるので、再起動すれば完了だ。 1.QGISの日本語サイト「htt […]
  • Bioconductor HeatplutsパッケージのregHeatmapで文字の大きさを変えるBioconductor HeatplutsパッケージのregHeatmapで文字の大きさを変える BioconductorのHeatplusパッケージのregHeatMap関数を用いると、ヒートマップを描けるが、行と列の文字の大きさを変える方法が分かり難かったので、備忘録として残しておく。 サンプルデータのために、Biobaseパッケージをインストールしておく。 > […]
  • R言語 CRAN Task View:最適化と数理計画R言語 CRAN Task View:最適化と数理計画 CRAN Task View: Optimization and Mathematical Programmingの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Florian Schwendinger, Hans W. […]
Python 度数分布表から乱数を生成する