乱数を扱う
乱数と一言で言うけども、色々な種類の乱数があるので、いくつかNumPyを使って作ってみる
乱数生成だけでなくランダムチョイス等も見ていく
つまり numpy.random
モジュールについて
一様乱数
特定の範囲の実数が均等な確率で発生する、まさに一様に発生する乱数
範囲の指定をしないものはデフォルトで 0以上1未満
で生成される
1次元の一様乱数
numpy.random.rand(要素数)
で作れる
random.rand
となるのが若干ややこしいな
2次元の一様乱数
もはやパターンかなと思いきや、タプルで指定ではなく、第1、2引数だ
範囲指定の一様乱数
numpy.random.uniform
で作れる
uniform(3, 5, 10)
で3以上5未満で10個
を表す
2次元も同様に
この場合はお決まりのタプルで渡す必要があるのか、注意
整数乱数
名前がすべてだが、特定の範囲の整数が同じ確率で発生する乱数
一様乱数と同様の部分は端折る
整数乱数
numpy.random.randint
で作れる
引数については一様乱数と同様
ランダムなリスト操作
ランダムに洗濯
洗濯じゃない選択(洗濯はランダムにしない)
choice
を使う
-
指定回数選択
numpy.random.choice(targets, 4)
でtargetsリストから4つ選択(回数は問わない) -
1度だけ選択
1度だけ選択される(リスト内で重複があれば当然重複もする)
replace=False
で1度しか出現しなくなる
ランダムに並び替え
長くないリストであれば、 choice(targets, 3, replace=False) で1度だけ選択するより
この並び替えを使うと良い
長いリストの場合はchoiceする方が効率は良い
その他様々な分布の乱数
標準正規乱数
numpy.random.randn
で作れる
デフォルトだと、平均が0 標準偏差1の正規分布になる
標準偏差については詳しくはWebでだが、散らばりの度合いを示したもの
正規乱数
numpy.random.normal
で作れる
平均が50 標準偏差10 の乱数10個
つまり正規分布? 本格的に統計学(?)、分布とかの勉強しないと理解に苦しむなぁ。。。
多次元も
ベータ乱数
numpy.random.beta
で作れる
- ベータ分布
- 軽く読んだけどマジムリ...
- 軽くじゃダメそうなので、ちゃんとそれ用に時間を取って理解した方が良さげ
二項乱数
numpy.random.binomial
で作れる
- 二項分布 (これはまだわかる!)
- 成功か失敗の結果を持つ試行を
n
回繰り返した時の分布 - 成功率
p
は一定とする
- 成功か失敗の結果を持つ試行を
この場合は、 成功率 p = 0.4 の試行を10回やった時の成功回数、を 10個
ポアソン乱数
numpy.random.poisson
調べてみたけどよくわからない系の分布でした・・・
単位時間あたり平均でλ回発生する事象の発生回数の分布
どういう時に使われるかだけあげておくと、
- 交番の事故の件数
- 30分に平均2回電話がかかって来るコールセンターで、1時間に6回電話がかかって来る確率
だそうです
λ = 0.8 のポアソン乱数10個
↑これ何!!!
わからなすぎるので一旦保留だな
多次元正規乱数
numpy.random.multivariate_normal
で作れる
正規乱数並みの難易度かと思いきや...
平均が[0, 0] 共分散行列が [[1, 0.5], [0.5, 1]] の多次元正規乱数
もはや調べるのも無駄な抵抗なので、いつかちゃんとやる
乱数の再現性
numpyなどで生成される乱数は全て擬似乱数と言って、必ずシードを元に生成される
シードは実行環境の初回実行時の時刻等で初期化される
なので、明示的にシードの指定をしなくても乱数が発生させられる
(個人的なイメージ: ビンゴカードのようなもの? 初回実行時に新しいビンゴカードが配られる)
何度実行しても同じ乱数が出ることを再現性がある
という
- 再現性のある乱数を発生させる方法
- 最初にシードを指定 (同じビンゴカードを使う)
- 状態を取得して、再現したいときに状態を設定 (状況に応じてビンゴカードの数字を変えちゃう?)
シード指定
seed(0)
で固定しているので、何度実行しても同じになる
状態設定
get_state/set_state
で取得、設定する
3行は常に同じだが、実行するたびに値は変わる
ファイルに保存
ファイルに保存して、それを読み込むことでも、再現性があると言える
感想
様々な乱数を見てきたけど、分布、統計という前提条件の壁がかなり高いことがわかってしまった
実践とまで言わずとも、自分で何かやってみようという段階になるまでには
まだまだ長い道のりになりそうだー