配列処理

[Python] リストからランダムに要素を選択する(random.choice)

今回は、Pythonでリストからランダムに要素を選択する方法についてご紹介します。

ランダムに要素を選択する方法とは

Pythonでリストなどのシーケンスからランダムに要素を選択する際には、主に標準ライブラリのrandomモジュールを使用します。

このモジュールには、以下のように要素を選択するメソッドがあります。

  • random.choice():リストから1つの要素をランダムに取得する
  • random.sample():リストから重複なしで複数の要素をランダムに取得する
  • random.choices():リストから重複を許容して複数の要素をランダムに取得する

この記事では、最も基本的でよく使われるrandom.choice()を中心に解説しながら、random.sample()random.choices()との違い、よくあるエラーの対処法などを紹介します。

random.choice()の基本的な使い方

random.choice()は、指定したリスト(またはタプルなどのシーケンス)から1つの要素をランダムに返す関数です。

最小限の実装ステップは以下のとおりです。

  • randomモジュールをインポートする
  • リストを用意する
  • random.choice()を呼び出して取得した要素を変数に格納する

random.choice()を使ったコード例

上記のコードを実行すると、my_listの要素の中から1つがランダムで選ばれ、表示されます。

実行結果

30

よくあるエラーと対処法

random.choice()を使用する際に起こりやすいのが、IndexErrorです。

これは、対象のリストが空である場合に発生します。

対策としては、あらかじめリストが空ではないことを確認したり、例外処理を行う方法があります。

このように、要素の数をチェックしてからrandom.choice()を呼び出すと安全に運用できます。

random.sample()とrandom.choices()の違い

要素を複数個ランダムに取得したい場合は、random.sample()またはrandom.choices()が役立ちます。

random.sample():重複なしで複数の要素を取得

実行結果

[10, 30, 40]

この例では、リストから3つの要素が重複なくランダムに選ばれます。

random.choices():重複を許容して複数の要素を取得

実行結果

[30, 30, 50]

同じ要素が繰り返し選ばれる可能性がある点で、random.sample()とは使い分けが必要です。

なお、乱数の再現性が必要な場合はrandom.seed()を使ってシード値を設定すると、同じ順序で要素が選ばれるようになります。

暗号学的に安全な乱数が必要な場合は、randomモジュールではなくsecretsモジュールを使用するとよいでしょう。

まとめ

random.choice()は、単一の要素をランダムに選ぶ代表的な方法です。

用途に応じてrandom.sample()やrandom.choices()を使い分けることで、さらに柔軟な処理が可能になります。

リストが空の場合のエラーには注意し、再現性やセキュリティの要件に合わせて適切に設定しましょう。