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

関連する記事

  • Python KNPを用いて係り受け構造を抽出する方法Python KNPを用いて係り受け構造を抽出する方法 Ubuntu14.04環境で、Python3と日本語構文・格・照応解析システムKNPを用いて係る語と受ける語のペアを抽出する方法をご紹介する。 係り受け構造を抽出するPython3のソースコードは次である。 from pyknp import KNP def […]
  • Ubuntu14.04とPython3でMeCabを使う方法Ubuntu14.04とPython3でMeCabを使う方法 MeCabは各種スクリプト言語(perl、ruby、python、Java)から、各言語バイディングで利用できるようになっている。 しかし、Pythonで用意されているのはPython2系のもので、残念ながらPython3系では使えない。 そこで、ここでは用意されているPython2系バイディングをPython3系に変換して使用する方法をお伝えする。 MeCab […]
  • Python CaboChaを用いて係り受け構造を抽出する方法Python CaboChaを用いて係り受け構造を抽出する方法 Pythonと日本語係り受け解析器であるCaboChaを用いて係る語と受ける語のペアを抽出する方法をご紹介する。 環境:Ubuntu14.04 Pythonツールのインストール PythonからCaboChaを扱うために、CaboChaに付属しているPythonのsetup.pyをインストールする。 これはPython2系専用であることに注意する。 caboch […]
  • C++ Boostによるコマンドライン引数処理C++ Boostによるコマンドライン引数処理 boost::program_optionsを用いると、コマンドライン引数(オプション)を比較的容易に解析することができる。 #include <iostream> #include <string> #include <boost/program_options.hpp> int main(int argc, char **argv) […]
  • Ubuntu 日本語構文・格・照応解析システムKNPをpythonから使えるようにするUbuntu 日本語構文・格・照応解析システムKNPをpythonから使えるようにする Ubuntu14.04で日本語構文・格・照応解析システムKNPをpythonから使えるようにする方法をお伝えする。 Python2系 まずはKNP - KUROHASHI-KAWAHARA […]
Python 度数分布表から乱数を生成する