前回の記事は、Matplotlibのステム機能で、茎を生やしたかっこいい図を作ってみました。 今回は、乱数の発生方法で調べても見つからなかったTipsをこの記事で書き残しておこうと思います。

Numpyの乱数機能を使って、任意の関数を中心とした乱数を発生させよう

Numpyの乱数発生機能rand()は、0.0〜1.0の値をとる乱数を発生させます。
rand(100)としたら、0.0〜1.0の値を100個作る、といった具合に使います。
randn()は標準正規分布 (平均0, 標準偏差1)とした乱数を発生させます。
randn()の平均、標準偏差を変更したい場合、normal()関数を使います。
normal(m,s,n)とすれば、平均m, 標準偏差sの正規分布に従うn個の乱数を発生させます。

さて、ここで、「sin関数を中心に乱数を発生させたいけど、どうすればいいんだろう?」と疑問に思って、Googleで調べてみたら、正解が見つかりませんでした。
なので、色々自分で試して、正解を見つけたので、Tipsとして書き残しておきます。

それではソースコードです。1行1行解説を加えています。説明を省けば、10行以内に収まるくらい簡単ですよ:)
import numpy as np import matplotlib.pyplot as plt fig, ax = plt.subplots(1,1) #figureの中にaxesを用意。(1,1)は1行1列の意味 n_points = 40 #分点数 theta = np.linspace(0, 2 * np.pi, n_points) #角度 [rad](0から2πまで。つまり一周) radius = 1 #半径 x = theta #x軸をθとする y1 = radius * np.sin(theta) - 2 #sin関数 ax.plot(x, y1, marker=".", color="blue", alpha=0.5) #sin関数をプロット #乱数を使ったグラフの作成 #random.normal(m,s,n)は平均値m,標準偏差sの正規分布に従う乱数をnを生成の意味。 r = np.random.normal(0,0.2,n_points) ax.plot(x, r, marker="o", linestyle="none") #平均値mに、好きな関数を入力すると、その関数を中心に乱数が発生する(水色のプロットのように) r1 = np.random.normal(y1,0.2,n_points) ax.plot(x, r1, marker="o", linestyle="none", color="skyblue") plt.savefig("logo14.png") plt.show()
これを出力すると、以下の図になります。
logo14
綺麗な図が描けました:D

normal()関数の平均値部分に、任意の関数を入力すると、その関数を中心とした乱数が発生する

知っていれば、どうって事ない事ですが、正規分布の乱数を発生させるnormal()関数の、平均値の部分に任意の関数(今回はsin関数)を入力すれば、その関数を中心とした乱数が発生します。まるで、乱数プロットをフィッティングしたら、sin関数が得られたような図になっていますが、プログラム中では、あくまでsin関数を中心に標準偏差0.2の乱数がプロットされる、というものです。
覚えておくと、何かと便利かもしれません◎


綺麗にできたので、この図もInstagramに投稿しようと思います:)