運任せは卒業!numpyのrandomでシミュレーションの達人になろう

こんにちは。ゆうせいです。

前回は、規則正しく並んだ数字を作る arange や linspace についてお話ししましたね。決まったルールで数字が並ぶのは気持ちがいいものですが、現実の世界はもっと予測不能で、デコボコしています。

例えば、サイコロを振ったときの出目や、明日の株価の動き、あるいはAIが学習を始める前の「真っさらな状態」など、次に何が起こるか分からない要素が必要な場面がたくさんあります。

そんな「偶然」をコンピュータの中で作り出してくれるのが、numpyの random(ランダム)モジュールです。

皆さんは、くじ引きをするときに「本当に平等かな?」とドキドキしたことはありませんか。プログラミングの世界でも、そのドキドキを再現することができるのです!

乱数とは「偽物の偶然」のこと

まず、専門用語の解説から始めましょう。プログラミングで扱うランダムな数字のことを、 乱数(らんすう) と呼びます。

実は、コンピュータは本来、指示されたことしかできない真面目な機械です。そのため、本当の意味で「デタラメ」な数字を作るのは苦手なのです。

そこで、数学的な計算式を使って、人間にはデタラメに見える数字の列を作り出しています。これを 疑似乱数(ぎじらんすう) と言います。

高校生の皆さんに例えるなら、「ものすごく複雑な計算をして、パッと見では規則性がバレないように工夫された数字の羅列」のことだと考えてください。

よく使う三つのランダム関数

numpyの random にはたくさんの機能がありますが、まずはこの三つを覚えれば完璧です!

1. 0から1までの小数を生む rand

np.random.rand() は、 0 以上 1 未満の小数をランダムに作ります。

これは「確率」をシミュレーションするときに便利です。例えば、「 0.7 以下の数字が出たら当たり!」と決めれば、 70 パーセントの確率で起こるイベントを再現できますね。

2. 整数をランダムに選ぶ randint

サイコロを作りたいなら np.random.randint() の出番です。 integer(整数)の略ですね。

開始 = 1

終了 = 7

このように指定すると、 1 から 6 までの整数をランダムに返してくれます。ここでも「終了の数字は含まない」というルールが適用されるので、 7 未満、つまり 6 までになる点に注意しましょう!

3. 標準正規分布に従う randn

少し難しい言葉が出てきましたね。 標(ひょう)準(じゅん)正(せい)規(き)分(ぶん)布(ぷ) とは、データの集まりが「平均 0 を中心にして、左右対称の山のような形」に散らばっている状態のことです。a normal distribution curve(AI 生成)

Getty Images

身長のデータやテストの点数など、自然界の多くのデータはこの形になると言われています。AIの学習で「現実的な初期値」を与えたいときによく使われます。

ランダム操作のメリットと注意点

ランダムを使いこなすと、以下のようなメリットがあります。

  • シミュレーションができる:何万回もサイコロを振る実験が、一瞬で終わります。
  • データの偏りを防げる:データをシャッフルして、公平に学習させることができます。

一方で、大きなデメリット(注意点)もあります。

それは、 「再現性(さいげんせい)」 がなくなることです。

「昨日エラーが出たときのランダムな数字をもう一度再現したい!」と思っても、普通に実行すると毎回違う数字が出てしまいます。これを防ぐために、 乱数シード(seed) という「乱数の種」を固定するテクニックがありますが、これはまた応用編でお話ししましょう。

二つのランダムを比較してみよう

関数名作る数字の種類主な用途
rand0 から 1 の小数確率、比率の決定
randint指定した範囲の整数サイコロ、トランプの引き当て
randn平均 0 前後の小数AIの初期化、自然なデータの再現

皆さんが作りたいゲームやプログラムには、どの関数が一番しっくりきそうですか。

実際にコードで運試し!

それでは、実際に数字を作ってみましょう。

import numpy as np

0.0から1.0の間の小数を3つ作る

print(np.random.rand(3))

1から6までの整数を10個作る(サイコロ10回分!)

print(np.random.randint(1, 7, 10))

2行3列の形で、正規分布に従う数字を作る

print(np.random.randn(2, 3))

実行するたびに、結果が変わるのを確認できましたか。これこそが、プログラミングに「命」を吹き込むランダムの力です!

運を味方につけるための指針

今回の random をマスターした皆さんは、もう静的な数字だけでなく、動的な変化を扱えるようになりました。

これからのステップとして、こんなことを試してみてください。

  1. np.random.shuffle() を使って、リストの順番をバラバラにする方法を調べてみる。
  2. 乱数シード np.random.seed(0) を最初に書いて、何度実行しても同じランダムな数字が出ることを確認する。
  3. randint を使って、おみくじプログラムを作ってみる。

偶然をコントロールできるようになると、プログラミングはもっともっと楽しくなります。

次は、バラバラになったデータを並べ替えたり、特定の条件で抜き出したりする「ソートとフィルタリング」について解説しましょうか。それとも、もっとAIに近い、行列の計算(内積など)に踏み込んでみたいですか。

皆さんの好奇心の向くままに、また一緒に学んでいきましょう!

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。