2013/04/04

ライブラリ:random

Python の「 random 」というライブラリについてご紹介します。

import random

「 random 」は乱数関連の機能を提供するライブラリです。 Python 本体に同梱された標準ライブラリのひとつです。

0 から 1 の間の浮動少数点数を返す関数 random() を基本に、整数を返す関数、指定したリストの中から要素を抽出する関数など、乱数関連の関数が豊富に用意されています。

random ライブラリの中からいくつかピックアップしてご紹介します。

random.random()
random() は、 0.0 から 1.0 の間の浮動小数点数を返します。厳密には区間 [0.0, 1.0) 、つまり、 0 を含む「 0 以上」から 1 を含まない「 1 未満」までの数を返します。

random.randrange(start, stop)
randrange() は、 start から stop までの整数の中からランダムにひとつを返します。 for ループでよく使う組み込み関数の range(start, stop) と同じように、 start は含みますが、 stop は含みません。つまり、「 startstart+1start+2 、...、 stop-1 」という合計「 stop - start 」個の整数が抽出対象の集合となります。

random.randint(a, b)
こちらも randrange() と同じく、指定された範囲の整数をランダムに選んで返す関数です。 randrange() とのちがいは、上限の値を含むかかどうかです。 randint(a, b) は最後の b が戻り値に含まれます。数学的に書けば「 integer n s.t a <= n <= b 」となります。

random.choice([リスト])
choice() は、与えたリストの要素からひとつをランダムにピックアップして返す関数です。引数はわかりやすさのために「リスト」と書いていますが、リストだけでなく、タプルや文字列など、シーケンス型の変数であれば何でも引数に取ることができます。サンプルは次のとおりです。

random.choice([1, 2, 3, 4])  # たとえば 3
random.choice(mydict.items())  # items() などと組み合わせれば辞書の要素もランダムで選べます

random.sample([リスト], [整数])
choice() がひとつだけ値を取り出すのに対し、 sample() は複数の要素を重複なく取り出してくれる関数です。元のリストに重複した要素があれば、重複分だけその要素を取り出す確率が高くなります。

この関数を使えば、たとえば、高校数学で習った組み合わせの問題の「袋に 7 個の玉が入っています。内訳は赤い玉が 4 つ、白い玉が 3 つです。その中から 3 つをランダムに取り出したときの・・・」といったシミュレーションも次のように簡単に試すことができます。

random.sample(['r', 'r', 'r', 'r', 'w', 'w', 'w'], 3)  # ['w', 'r', 'w'] など

私自身は使ったことはありませんが、この他にも、一様分布・正規分布・三角分布・指数分布・ガウス分布などにもとづいて値をランダムに生成する関数(前から順に uniform() triangular() expovariate() gamavariate() )なんかも用意されているので、そのあたりのちょっと複雑なランダム化機能が必要な場合は公式ドキュメントをご覧になってみてください。


インストール


「 random 」は標準ライブラリなので Python 本体に同梱されています。別途インストールする必要はありません。


参考

2 件のコメント:

juvat911 さんのコメント...

pythonを勉強中のプログラミング初心者です。
randrange関数の用途で戸惑っていましたが、このページのおかげで不明な点が解消されました。
ありがとうございます(´・ω・`)

後藤隼人 さんのコメント...

juvat911 さん

コメントいただきありがとうございます。

そうでしたか。それはよかったです!名前と動作が似た関数がたくさんあって、目的に合ったものを見極めるのに骨が折れますよね。

がんばってください!またお気軽にコメントをお寄せいただければと思います :)