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

関連する記事

  • 統計的因果推論による傾向スコアとIPW推定量の基本的な考え方統計的因果推論による傾向スコアとIPW推定量の基本的な考え方 [latexpage] 統計的因果推論による因果効果を調べる手段として、傾向スコアとIPW推定量という概念があります。ここでは、なぜ傾向スコアを考えるのか、傾向スコアの逆数の重み付けはどのような意味があるのかを、複雑な数式を用いずに具体例を通してご説明します。 さっそくですが、次の具体例を考えます。 […]
  • Ubuntu16.04で任意のバージョンのNode.jsをインストールする方法Ubuntu16.04で任意のバージョンのNode.jsをインストールする方法 Ubuntu16.04で、任意のバージョンのNode.js環境を構築する方法をお伝えいたします。 apt-getコマンドによりNode.jsをインストールしようとすると、かなり古いバージョンがインストールされます。 そのため、最新または任意のバージョンをインストールするときは、PPA(personal package […]
  • 商品開発に役立つコンジョイント分析の仕方商品開発に役立つコンジョイント分析の仕方 コンジョイント分析とは、顧客が商品やサービスの持つ複数の属性について、どの点を重要視しているかを探る調査手法だ。例えば、あなたがパソコンを購入する場合を考えてみて欲しい。スペックだけで購入を決定しているだろうか。また、デザインだけで購入を決定しているだろうか。おそらくそうでないはずだ。パソコンは非常に多種多様な製品が市場に出回っているため、何点かに購入候補を絞ってその中から選 […]
  • Ubuntu,R OpenGLを用いた3次元可視化パッケージrglのインストール方法Ubuntu,R OpenGLを用いた3次元可視化パッケージrglのインストール方法 Ubuntu上のRで、OpenGLを用いた3次元可視化パッケージであるrglをインストールする方法をいくつかのパターンに分けてお伝します。 Rはaptコマンドによりインストールされているものとします。 R上でinstall.packages関数によりrlgパッケージをインストールしようとしても、次のように「X11が見つからない」とエラーが出てインストールできません。 […]
  • R実装と解説 母平均の検定(母分散未知) [latexpage] 母分散が未知の場合の母平均の検定とは、母集団が正規分布に従い、母分散が未知のときに母平均が標本平均と「異なる」または「大きい」、「小さい」かどうかを、検定統計量がt分布に従うことを利用して検定します。 統計的検定の流れ 検定の大まかな流れを確認しておきます。 帰無仮説H0と対立仮設H1をたてます […]
Python 度数分布表から乱数を生成する