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 […]
  • R言語 CRAN Task View:Web技術とサービスR言語 CRAN Task View:Web技術とサービス CRAN Task View: Web Technologies and Servicesの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Mauricio Vargas Sepulveda Contact: mavargas11 at […]
  • WindowsでHeidiSQLを使用してMariaDBをバックアップ・リストアするの方法WindowsでHeidiSQLを使用してMariaDBをバックアップ・リストアするの方法 WindowsでHeidiSQLを使用してMariaDBをバックアップおよびリストア(復元)する方法をお伝えいたします。 MariaDBのバックアップ方法はいくつかありますが、今回ご紹介する方法は、ダンプファイルの作成という方法になります。MariaDBのダンプファイルの作成は、通常、CUI(黒い文字だけの画面)でmysqldumpというコマンドラインツールを用いて行い […]
  • WindowsにMariaDBをインストールする手順WindowsにMariaDBをインストールする手順 WindowsにMariaDBをインストールする手順についてお伝えいたします。 ファイルのダウンロード MariaDBのインストールファイルをダウンロードするために、次のサイトに移動します。 MariaDB.org - Supporting continuity and open […]
  • R言語 CRAN Task View:医用画像解析R言語 CRAN Task View:医用画像解析 CRAN Task View: Medical Image Analysisの英語での説明文をGoogle翻訳を使用させていただき機械的に翻訳したものを掲載しました。 Maintainer: Brandon Whitcher, Jon Clayden, John Muschelli Contact: bwhitcher at […]
Python 度数分布表から乱数を生成する