Pythonの「randomモジュール」は擬似乱数を生成するものですが、便利な基本モジュールの一つなので、しっかり押さえておく必要があります。
Pythonのプログラミングを始めたいと思っている方や始めたばかりの方にとってもわかりやすいように、実際の具体的なコードの入力例を交えながら解説しますので、是非参考にしてください。そして、Pythonのrandomモジュールを、様々なケースで使いこなせるようになりましょう。
Pythonのrandomモジュールとは何?
Pythonでランダムな処理が必要な際に有効活用できるのが「randomモジュール」です。Pythonの標準モジュールの一つであり、ランダムな要素や擬似乱数を扱う場合に効果を発揮しますので、やり方を覚えておくようにしましょう。
乱数とは、予測不可能で無作為な値のことを指し、乱数は様々なシチュエーションで使用されます。たとえば、サイコロを投げたときどのような値が出るかわからない数字のことも乱数と言います。他にもゲームの世界で、敵の行動やイベント発生なども乱数がゲームプレイの一部として使われているのです。サイコロの場合では1-6の範囲ですが、randomモジュールではその範囲を自由に決定することができます。
コンピュータプログラムにおいては、特に乱数は擬似乱数として生成されることが一般的です。すなわち、ランダムな数列であるように見せかけて、実際は完全に無作為ではないと言えます。しかし、Pythonのrandomモジュールを使用することにより、プログラム内で乱数を簡単に生成することができ、ゲーム、シュミレーション、統計学、暗号学などの様々な用途に応用することが可能です。
Pythonのrandomモジュールの基本動作
Pythonのrandomモジュールがどのようなものかを説明した次は、早速実践に移りたいと思います。
randomモジュールのimport
randomモジュールを使用する前に、Pythonのプログラムの先頭でimport文を使ってrandomモジュールをインポートすることを忘れないようにしましょう。これをしないとエラーがでます。
import random
これにより、randomモジュールがプログラム内で利用可能になります。上記のように「import random」を一番最初に記述することで、randomモジュール内の関数やクラスを使うことができます。
1未満のfloat型の乱数を取得
float型の乱数の取得はrandomモジュールの中で最も基本的な関数です。random.random関数は、0.0から1.0の範囲のfloat型の値を反映します。
# 0以上1未満のfloat型の乱数を生成random_number = random.random()print(random_number)
実行結果:0.007005218802688118
このように0以上1未満の乱数が生成され、このコードを実行する度にランダムな値が出力されます。
指定した範囲の整数の乱数を取得
random.randint(a, b)関数は、randomモジュールで提供されている関数の1つで、指定した整数の範囲aからbまで(両端を含む)のランダムな値を生成します。
# 1から10までの整数を生成random_integer = random.randint(1, 10)print(random_integer)
実行結果:3
# 100から200までのランダムな整数を生成random_number = random.randint(100, 200)print(random_number)
実行結果:112
random.randint関数は、乱数の範囲を指定してランダムな整数を得る際に便利です。サイコロの出る目のシュミレーション等に活用できるでしょう。
指定した範囲のfloat型の乱数を取得
random.uniform関数はrandom.randint関数と同様に、指定した範囲(a, b)でランダムな値を生成しますが、random.uniform関数はfloat型の乱数を生成します。
# 0.0から1.0までのランダムなfloat型の乱数を生成random_number = random.uniform(0.0, 1.0)print(random_number)
実行結果:0.40476047913052926
指定されたステップ幅でランダムな整数を取得
random.randrange(start, stop, step)関数は、指定された範囲の中、指定されたステップ幅でランダムな整数を生成できます。具体的にはstartからstop未満までの整数の範囲からランダムに1つの整数を返します。stepは整数であり、startから始まってstepずつ増加する整数を生成できます。
# 0から10までのランダムな偶数を生成random_number = random.randrange(0, 11, 2)print(random_number)
実行結果:4
リストの中身をランダムに取得
random.choice関数は、リストや文字列などといった複数の要素を含むシーケンス型オブジェクトからランダムに一つの要素を取得ことができます。以下のコードでは、3つの要素を持つリストからランダムにひとつ、要素を取り出しています。
mylist = ['apple', 'banana', 'melon']print(random.choice(mylist))
実行結果:banana
また、以下のrandom.sample関数を用いることで、重複なしでランダムに複数の要素を取り出すことができます。
mylist = ['apple', 'banana', 'melon', 'date', 'elderberry']print(random.sample(mylist, 3))
実行結果:[‘elderberry’, ‘banana’, ‘apple’]
リストの中身をシャッフルする
random.shuffle関数は、シーケンス型オブジェクトの要素をランダムにシャッフルができます。以下の例ではrandom.shuffle関数を用いることでリストの要素の順番がランダムにシャッフルされました。
mylist = ['apple', 'banana', 'melon', 'date', 'elderberry']random.shuffle(mylist)print(mylist)
実行結果:[‘elderberry’, ‘apple’, ‘date’, ‘banana’, ‘melon’]
Pythonのrandomモジュールの応用
Pythonのrandomモジュールの基本的な使い方を押さえたところで、少し応用的な使い方の例をご紹介したいと思います。
文字列をランダムに生成する方法
randomモジュールとstringモジュールを組み合わせることによって、文字列をランダムに生成することが可能です。stringモジュールとは文字列や文字集合を簡単に取得することができるPythonの標準ライブラリの一つです。以下の例ではstringモジュールの「string.ascii_letters」と呼ばれるアルファベットの文字列と、string.dilightsと呼ばれる0から9までの文字列を使用しています。
import randomimport stringrandom_string = string.ascii_letters + string.digitsprint(random_string)
実行結果=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789
アルファベットの小文字・大文字と数字が出力されました。次にjoinメソッドを活用して、ランダムな8文字の文字列を生成してみたいと思います。
random_string = ''.join(random.choices(string.ascii_letters + string.digits, k=8))print("ランダムな文字列:", random_string)
実行結果:CddlLW2u
確率的なイベントのシュミレーション
基本動作のところで説明したrandom. randint(a, b)関数を用いることによって確率的なイベントのシュミレーションを行えます。以下の例では、サイコロを振るシミュレーションを行ってみました。
# サイコロの出目をシミュレーションdice_roll = random.randint(1, 6)print("サイコロの出目:", dice_roll)
実行結果:3
さらにroll_die()関数と、for _ in rangeを組み合わせて、3回分のサイコロの目をシュミレーションしてみました
def roll_die(): return random.randint(1, 6)# サイコロを3回振って結果を表示for _ in range(3): result = roll_die() print(result)
実行結果:(3, 5, 2)
ランダムな色の生成
randomモジュールとHTMLカラーコードを組み合わせることで、ランダムな色も生成することができます。HTMLカラーコードとは色を指定するための方法で、一般的なHTMLカラーコードは16進数のRGB(赤、緑、青)の値を組み合わせることで色を表現することができます。なお、各色0-255の整数値によって色が決定されます。
# 0から255の間でランダムな整数を生成def random_color(): r = random.randint(0, 255) g = random.randint(0, 255) b = random.randint(0, 255) return r, g, b# ランダムな色を生成して表示color = random_color()print("ランダムな色:", color)
実行結果:(135, 233, 118)
出力された3つのRBG値を組み合わせることで、ランダムな色が生成されます。
Pythonのrandomモジュールを扱う上で大切なこと
randomモジュールの操作方法やどのようなことができるかについてはなんとなくイメージできたかと思います。最後にPythonのrandomモジュールを扱う上で大切にしてほしいことを実際の操作例を交えながらご紹介します。
シード値の設定
randomモジュールの乱数生成のアルゴリズムは「シード値」と呼ばれる初期値に依存しており、同じシード値を使用すれば、同じ乱数列が生成されます。したがって、シュミレーションを実行する際や、再現性を保つためには、シード値を設定することが大切です。
# 任意のシード値を設定random.seed(123) print(random.random())
実行結果:0.052363598850944326
乱数の利用前に初期化を行う
プログラム内で複数のrandomモジュールを使用すると、予期せぬバグが発生する場合があります。複数のrandomで乱数を利用する場合は、それぞれの部分でrandom.seed()関数を呼び出しておけばエラーを避けることができます。
適切な関数を選ぶ
randomモジュールにはrandom()、randint(a, b), uniform(a, b), randrange(start, stop, step)など、様々な乱数生成関数があります。目的や用途、シュミレーションに応じて適切な関数を使用するようにします。
適切な分布を考える
少し応用的な話になりますが、どのような分布のデータを使うかによって生成される乱数の結果は異なってきます。例えばrandom.gauss(mu, sigma)関数を使用すると正規分布に基づく乱数を生成し、expovariate(lambd)関数を使用すると指数分布に基づく乱数が生成されます。他にもさまざまな確率分布に基づく乱数生成関数が用意されているので、適切な分布に基づいて関数を選ぶようにしましょう。
# 平均が10、標準偏差が3の正規分布に基づく乱数を生成random_number = random.gauss(10, 3)print(random_number)
実行結果:13.234905156517176
# パラメータλが1の指数分布に基づく乱数を生成random_number = random.expovariate(1)print(random_number)
実行結果:0.07146765609605192
Pythonのrandomモジュールに関してもっと学習してみたい方はPythonの公式ドキュメントをチェックすることをお勧めします。Pythonのバージョンごとのドキュメントを確認することができます。
Python公式ドキュメント:https://docs.python.org/ja/3.9/library/random.html
Pythonの配列についてまとめ
今回はPythonのrandomモジュールに関して、基本的なことを中心に、具体的な操作方法を交えながらご紹介してみました。Pythonのrandomモジュールには様々な便利な機能があり、乱数の再現性、シーケンスのシャッフル、ランダムな要素の取得、適切な分布の選択など、使いこなすことができれば非常に強力なツールになります。本記事を参考にまずは基本的なところを抑えて、Pythonのrandomモジュールをマスターしてみましょう。