【NumPy】乱数(ランダム)の出し方を簡単に偏らせる方法

この記事では、Pythonモジュール「NumPy」で乱数(ランダム)の出し方を簡単に偏らせる方法をソースコード付きで紹介します。

乱数の偏らせ方

NumPyでは、「numpy.random.rand」を使って一様乱数(0~1の実数値)を生成できます。
NumPyでは、F分布など様々な確率分布に従った乱数生成ができますが、もっと簡単な方法で乱数の出し方を偏らせることができます。
ゲームなどで活用できるテクニックです。

ヒストグラム(一様乱数)

①小さい値の出現回数を増やす

まずは、小さい値の出現回数を増やすテクニックです。
一様乱数同士を掛け合わせることで0に近い値ほど、出現回数が高くなります。
掛け合わせる回数を増やすほど、その効果も高くなります。

コード例

numpy.random.rand(N) * numpy.random.rand(N)

ヒストグラム

②大きい値の出現回数を増やす

次に、大きい値の出現回数を増やすテクニックです。
①を応用し、「1 – (一様乱数同士を掛け合わせた値)」を計算すれば逆に大きい値の出現回数を増やせます。

コード例

1 - (numpy.random.rand(N) * numpy.random.rand(N))

ヒストグラム

③中央値(0.5)付近の出現回数を増やす

最後に中央値の出現回数を増やすテクニックです。
一様乱数同士を加算し、2で割ると中央値に近い値ほど、出現回数が高くなります。
加算回数を増やすほど、その効果も高くなります。(3回足したら3で割ります)

コード例

(numpy.random.rand(N) + numpy.random.rand(N))/2

ヒストグラム

ソースコード

サンプルプログラムのソースコードです。

# -*- coding: utf-8 -*-
import numpy as np
import matplotlib.pyplot as plt

def main():
    # サンプル数
    N = 500

    # 乱数配列を生成(0~1の実数)
    x1 = np.random.rand(N)
    x2 = np.random.rand(N)

    #y = x1 # 一様に分布
    #y = x1 * x2 # 小さい値ほど、出現率が高い
    #y = 1 - (x1 * x2) # 大きい値ほど出現回数が高い
    y = (x1 + x2)/2 # 中央値(0.5)に近い値ほど、出現率が高い

    # ヒストグラムの算出
    hist, bins = np.histogram(y,N,[0,1])

    # ビンの末尾を削除して配列のサイズをhistと揃える
    bins = np.delete(bins, -1)

    # グラフ表示
    plt.xlim(0, 1) # x軸の範囲
    plt.ylim(-5, 20) # y軸の範囲
    plt.scatter(bins, hist, s=5) # 散布図
    plt.xlabel("Value")
    plt.ylabel("Number of occurrences")
    plt.grid()
    plt.show()

if __name__ == '__main__':
    main()

おすすめ記事

Python入門 サンプル集
NumPy入門 サンプル集

コメント