【Python 入門】ランダムな小数・整数を生成するためのPython randomモジュールの使い方

Python 入門_ランダムな小数・整数を生成するためのPython randomモジュールの使い方

こんにちは! 株式会社キカガク認定講師の前田晋弥です。
普段はフリーランスのITコンサルタントとして、中小企業のお客様に対して、IT導入や情報セキュリティ対策、AI・IoTの導入サポート等をしています。
私自身、キカガクの長期コース受講期間中に、AI搭載の自作アプリケーションを作成したり、E資格を取得したりしました。

プログラミングを学習中の皆さまは、人生ゲームのルーレット機能のようなものをアプリで実装する際などに、ランダムな数字を出したいと思うことはありませんか?

本記事では、 Python の random モジュールの使い方を解説しますので、ぜひ最後まで読んでみてくださいね!

random モジュールとは

Python の random モジュールは、ランダムな数値や選択を行なうための機能を提供するモジュールです。これを使うと、乱数(ランダムな数値)を生成したり、リストからランダムに要素を選んだりすることができます。

random モジュールは、プログラム内でランダム性を持たせたい場合に非常に便利です。
例えば、ゲームでランダムに敵を動かしたり、テストデータを生成したりする場合に活用できます。まずは、簡単な乱数生成やリストのシャッフルなどから試してみることができます。

random モジュールのインポート

random モジュールを使用するには、まずはインポートをする必要があります。そうすることで、 random モジュール内の機能や関数を使うことができるようになります。

まず、 random モジュールをインポートするためには、以下のコードを使います。

Python
import random

この1行を Python のプログラムに追加することで、 random モジュールが使えるようになります。 random モジュールは Python に標準で含まれているので、インストールは不要です。

モジュールを別名でインポートすることもできます。例えば、 random モジュールを rd という短い名前でインポートすることもできます。

Python
import random as rd

モジュールのインポートについて、さらに理解を深めたい方は、以下の記事を参考にしてください。

0以上1未満の浮動小数点数を生成: random.random()

モジュールをインポートした後は、 random モジュールの関数を次のように使います。

Python
# 0.0から1.0の間のランダムな浮動小数点数を生成
random_value = random.random()
print(random_value)

上記のコードでは、 random.random() 関数を使って 0.0 から 1.0 の間のランダムな数値を生成し、それを表示しています。

任意の範囲の浮動小数点数を生成: random.uniform()

random.uniform() 関数は、指定した範囲内でランダムな浮動小数点数(小数を含む数値)を生成するための関数です。この関数を使うと、任意の範囲の中からランダムな小数を取得することができます。

random.uniform() 関数は、次のように使います。

Python
# 1.0から10.0の間のランダムな小数を生成
random_value = random.uniform(1.0, 10.0)
print(random_value)     # 例: 7.53423

random.uniform() 関数には2つのパラメータを指定します。

  • a:生成される数値の下限(最小値)
  • b:生成される数値の上限(最大値)

この関数は、 a と b の間にある小数( a と b を含む)をランダムに生成します。例えば、 random.uniform(1.0, 10.0) とすると、 1.0 以上 10.0 以下の間のランダムな浮動小数点数が返されます。

任意の範囲の整数を生成:random.randint()

random.randint() 関数は、指定した範囲内でランダムな整数を生成するための関数です。この関数を使うと、特定の範囲の中からランダムに整数を取得できます。たとえば、サイコロの目をシミュレーションしたり、ランダムに数値を選びたい場合に便利です。

random.randint(a,b) 関数には 2 つのパラメータを指定します。

  • a:生成される数値の下限(最小値)
  • b:生成される数値の下限(最小値)

この関数は、 a から b までの範囲の整数( a と b を含む)をランダムに生成します。例えば、 random.randint(1, 10) とすると、 1 から 10 の間の整数がランダムに選ばれます。

Python
# 1から10の間のランダムな整数を生成
random_number = random.randint(1, 10)
print(random_number)    # 例:7

この場合、 random.randint(1, 10) は 7 のような整数を生成する可能性があります。毎回実行するたびに異なるランダムな整数が生成されます。
例えば、次のようなシナリオでは random.randint() 関数を使用できます。

  • サイコロの目をシミュレーション: サイコロの目は 1 から 6 の間の整数です。これをシミュレートするためには、 random.randint(1, 6) を使います。
Python
# サイコロの目をシミュレーション
dice_roll = random.randint(1, 6)
print(dice_roll)  # 例: 3
  • ランダムな選択肢を選ぶ: 例えば、 1 から 100 の間でランダムに当たりの番号を選ぶゲームを作ることができます。
Python
# 1から100の間でランダムに当たりの番号を生成
winning_number = random.randint(1, 100)
print(winning_number)  # 例: 42

random.randint() 関数は、特定の範囲内でランダムな整数を生成するために使います。これにより、ゲームやシミュレーション、テストデータの生成など、さまざまな場面でランダム性を簡単に導入することができます。最小値と最大値を指定するだけで、その範囲内のランダムな整数を取得できるので、非常に使いやすいです。

倍数を指定して任意の範囲の整数を生成:random.randrange()

random.randrange() 関数は、指定した範囲内でランダムな整数を生成するための関数です。この関数は、 random.randint() に似ていますが、 randrange() 関数の方が柔軟な指定ができる点が特徴です。例えば、範囲内の数値をステップごとに飛ばして選ぶこともできます。

random.randrange() 関数には、いくつかのパラメータを指定することができます。

  • start:範囲の開始点(省略可能)。省略した場合、デフォルトで 0 になります。
  • stop:範囲の終了点。 stop の値は含まれません。
  • step:間隔(省略可能)。この値で飛ばしながら整数を生成します。省略した場合、デフォルトで 1 になります。
Python
# 0から9の間でランダムな整数を生成
random_number = random.randrange(10)
print(random_number)

このコードでは、 0 から 9 の間の整数がランダムに選ばれます。 random.randrange(10) は、 0 以上 10 未満の整数を返します。

Python
# 1から11まで2ずつ飛ばした値の中でランダムな整数を生成
random_number = random.randrange(1, 11, 2)
print(random_number)  # 例: 5

この例では、 1 から 11 まで 2 ずつ飛ばした値、つまり 1, 3, 5, 7, 9 のいずれかの値がランダムに選ばれます。 step が 2 に設定されているため、 2 ごとに飛ばして整数が生成されます。

random.randrange() 関数は、範囲内の整数をランダムに生成する際に非常に便利なツールです。特に、ステップごとに値を飛ばしながらランダムに選ぶ場合や、特定の範囲内で柔軟な選択が必要な場合に役立ちます。 randint() 関数よりも少し柔軟性が高いので、状況に応じて使い分けると良いでしょう。

randomモジュールの応用

Python の random モジュールを使うと、様々なランダム性を持たせたプログラムを作ることができます。以下では、リストからランダムに要素を選択する方法や、乱数を使った簡単なゲームの開発方法などについて解説します。

リストからランダムに要素を選択する

リストやタプルなどのシーケンスからランダムに1つの要素を選ぶには、 random.choice() 関数を使います。

Python
# フルーツのリスト
fruits = ['apple', 'banana', 'cherry', 'date', 'elderberry']

# リストからランダムに1つの要素を選択
random_fruit = random.choice(fruits)
print(f"今日のおすすめフルーツは: {random_fruit}")

このコードでは、リスト fruits からランダムに 1 つのフルーツが選ばれ、表示されます。

ランダムな順列の生成

リストの要素をランダムに並び替えたい場合は、 random.shuffle() 関数を使います。これにより、リストの順番がランダムに変更されます。

Python
# 数字のリスト
numbers = [1, 2, 3, 4, 5]

# リストの要素をランダムに並び替える
random.shuffle(numbers)
print(f"ランダムな順序に並び替えたリスト: {numbers}")

このコードでは、リスト numbers の順序がランダムに並び替えられます。

偏った確率分布に基づくランダムな値の生成

random.choices() 関数を使うと、特定の確率に基づいてリストからランダムに要素を選択することができます。例えば、特定の要素が選ばれる確率を高くすることができます。

Python
# 選択肢のリスト
colors = ['red', 'blue', 'green']

# 確率分布(weights)を設定してランダムに選択
selected_color = random.choices(colors, weights=[10, 1, 1], k=1)
print(f"選ばれた色は: {selected_color[0]}")

この例では、 ‘red’ が他の色に比べて 10 倍の確率で選ばれるようになっています。

乱数を使ったゲームの開発

乱数を使った簡単なゲームを作ってみましょう。ここでは、 1 から 100 までの数字を当てる「数字当てゲーム」を作ります。

Python
def number_guessing_game():
    # 1から100までのランダムな数字を生成
    target_number = random.randint(1, 100)
    attempts = 0
    
    print("1から100の間の数字を当ててください。")

    while True:
        # ユーザーに数字を入力してもらう
        guess = int(input("数字を入力してください: "))
        attempts += 1

        # 推測した数字とターゲットの数字を比較
        if guess < target_number:
            print("もっと大きい数字です。")
        elif guess > target_number:
            print("もっと小さい数字です。")
        else:
            print(f"正解です!{attempts}回で当たりました。")
            break

# ゲームを実行
number_guessing_game()

このゲームでは、プレイヤーが 1 から 100 の間でランダムに選ばれた数字を当てるまで何度も推測を行います。プレイヤーが正解すると、試行回数とともにメッセージが表示されます。

random モジュールを使うことで、プログラムにランダム性を持たせることができます。リストからランダムに要素を選択したり、ランダムな順列を生成したり、特定の確率分布に基づいたランダムな値を選んだりすることが可能です。
また、乱数を使ったゲームを作ることもできるため、 Python でのプログラミングがさらに楽しくなります!

randomモジュールの注意点

random モジュールは非常に便利ですが、使用する際にはいくつかの注意点があります。
これらの注意点を理解することで、安全で適切な方法でランダム性をプログラムに取り入れることができます。以下に、セキュリティ、擬似乱数の性質、乱数生成器の初期化について説明します。

セキュリティ上の注意事項

random モジュールで生成される乱数は、セキュリティ目的には適していません。これらの乱数は「擬似乱数」と呼ばれ、ある種の規則性があるため、予測可能です。例えば、暗号の鍵を生成する場合など、セキュリティが重要な場面では、 random モジュールを使用するべきではありません。

対策:
セキュリティが重要な場合は、 secrets モジュールを使用することが推奨されます。 secrets モジュールは、予測が非常に困難な「真の乱数」に近い乱数を生成します。

Python
import secrets

# セキュアなランダムな整数を生成
secure_number = secrets.randbelow(100)
print(secure_number)

このコードでは、 secrets モジュールを使って 100 未満のセキュアなランダム整数を生成します。

擬似乱数の性質と真の乱数の違い

random モジュールが生成する乱数は、厳密には「擬似乱数」です。これは、数学的なアルゴリズムを使って生成されたもので、完全にランダムではありません。擬似乱数は、同じ初期化条件(シード)であれば、同じ順序で乱数を生成する性質があります。

真の乱数(例えば、物理的な現象から得られる乱数)は、完全に予測不可能です。真の乱数は、擬似乱数に比べて生成が難しく、特殊な用途に限られます。

Python
# シード値を設定
random.seed(42)

# 同じシード値なら同じ乱数列が生成される
print(random.randint(1, 100))  # 例: 82
print(random.randint(1, 100))  # 例: 15

このコードでは、 random.seed(42) によって擬似乱数生成器が初期化されます。シードが同じであれば、何度実行しても同じ順序の乱数が生成されます。

乱数生成器の初期化時刻による制約

random モジュールでは、通常、プログラムが開始された時刻をもとに乱数生成器が初期化されます。これにより、プログラムが実行されるたびに異なる乱数が生成されるようになっています。しかし、短時間に何度も乱数を生成すると、シードが同じになり、同じ乱数が生成される可能性があります。

対策:
ほとんどの場合、デフォルトの初期化で問題ありませんが、特定の状況ではシードを手動で設定したり、短期間に複数の乱数を生成する場合には注意が必要です。

random モジュールを使う際には、以下の注意点を理解しておくと良いでしょう。

  • セキュリティ上の注意事項: random モジュールはセキュアな乱数生成には不向きです。セキュリティが重要な場合は secrets モジュールを使いましょう。
  • 擬似乱数の性質: random モジュールの乱数は擬似乱数であり、シード値によって再現可能です。真の乱数とは異なるので、用途に応じて使い分けることが重要です。
  • 乱数生成器の初期化時刻による制約:短時間に大量の乱数を生成する場合には、シードの重複に注意が必要です。必要に応じてシードを手動で設定しましょう。

これらのポイントを理解することで、 random モジュールを安全かつ効果的に利用できるようになります。

まとめ

最後までお読みいただき、ありがとうございました。
ここまで random モジュールのインポートから、 random モジュールの様々な関数の使い方や応用方法、注意点について学んできました。

ぜひ、ご自身でもサンプルの Python コードを Google Colaboratory 等にコピーしてみて、どのように動作するのか確認してみてください。
Google Colaboratory の使い方については、以下の記事を参考にしてみてください。

また、機械学習を行なう際に、 1 つのデータセットからテスト用データをランダムに抽出したい場合にも使えるので、これから機械学習を学ぶ方には、 random モジュールは特に習得していただきたい機能です!

さらに機械学習を学びたいという方は、ぜひキカガクラーニングから無料講座を試してみてください。また、機械学習を体系的に学べるキカガクの長期コースもおすすめです!

DX を推進する AI ・データサイエンス人材育成コース

プログラミング未経験から、AI やデータサイエンスを学ぶことのできる 6 ヶ月間のコースです。転職実績も豊富で、自走できる AI人材を多く輩出しています。