Python で乱数を扱うには、標準ライブラリの random
モジュールを使います。数値の乱数生成はもちろん、シーケンス(リストやタプルなど)からランダムに要素を選びたいときにも役立ちます。本記事では、シーケンス内の要素をランダムに選択・抽出・並び替えするための関数を詳しく見ていきましょう。
1. random.choice(seq)
:ランダムに 1 要素を選ぶ
-
概要
choice()
は、与えられたシーケンス(リスト、タプル、文字列など)から、ランダムに 1 つの要素を取得します。実行するたびに異なる要素が返される可能性があるのが特徴です。 -
使用例
import random num_list = [1, 2, 3, 4, 5] random_num = random.choice(num_list) print(random_num) # 実行のたびに1〜5のいずれかが表示される
-
ポイント
- 文字列に対しても利用できます:
random.choice("ABCDE")
→'A'
〜'E'
のいずれか 1 文字。 - 単純に「ランダムでひとつだけ選びたい」というシチュエーションで便利です。
- 文字列に対しても利用できます:
2. random.choices(seq, k=n)
:重複を許して複数要素を選ぶ
-
概要
choices()
は、シーケンスから複数の要素を選択しますが、同じ要素を何度も選択する可能性がある「復元抽出」方式です。k
引数で取得したい要素の数を指定します。 -
使用例
import random num_list = [1, 2, 3] random_nums = random.choices(num_list, k=6) print(random_nums) # 例: [3, 2, 2, 3, 2, 1] など、要素が重複していてもOK
-
ポイント
- 大量のサンプルが必要なときに便利です。例えばガチャの結果を 10 回連続で取得するなど。
- 同じ要素が何度も含まれるかもしれない点に注意が必要です。
3. random.sample(seq, k=n)
:重複を許さずに複数要素を選ぶ
-
概要
sample()
は、シーケンスから複数の要素を重複なく取得する「非復元抽出」を行います。
k
引数で取得したい要素の数を指定し、抽出した要素を要素数k
のリストで返します。 -
使用例
import random num_list = [1, 2, 3, 4, 5] random_two = random.sample(num_list, 2) print(random_two) # 例: [3, 1] など、実行のたびに結果が変わるが重複はしない
-
すべての要素を一度だけランダムに取得したい場合
# シーケンスの長さだけ抽出数を指定する random_all = random.sample(num_list, len(num_list)) print(random_all) # 例: [5, 2, 1, 4, 3] など、順番だけがランダムに変わる
-
ポイント
- 同じ要素が 2 度選ばれることはありません。
- ランダムに選んだ要素を漏れなく 1 回だけ使いたいときに便利です。
4. random.shuffle(seq)
:リストを破壊的にシャッフルする
-
概要
shuffle()
はリストの要素をそのまま並べ替え、順序をランダムに変更します。戻り値はNone
なので、リストそのものの並びが変わったと理解しておきましょう。 -
使用例
import random num_list = [1, 2, 3, 4, 5] random.shuffle(num_list) print(num_list) # 例: [3, 1, 4, 5, 2] など、元の並びは失われる
-
ポイント
- タプルや文字列など、イミュータブルなシーケンスには使用できません(リストに変換する必要があります)。
- トランプの山札をシャッフルするなど、「もとの順序が直接ランダムに変わる」イメージが必要なときに便利です。
5. 使い分けのポイント
- 1 要素だけランダムに取りたい
→random.choice()
- 重複を許しながら複数要素を選びたい
→random.choices(seq, k=n)
- 重複を許さずに複数要素を選びたい
→random.sample(seq, k=n)
- シーケンスそのものをランダムな順序に並べ替えたい
→random.shuffle()
応用: 「全要素をランダムな順番で取得したい」場合は、random.sample(seq, len(seq))
を使って、シーケンス全体を並べ替えた新しいリストを作成するか、random.shuffle()
で元のリスト自体を並べ替える方法があります。
6. シード値による再現性
乱数は実行のたびに変わるため、テストやデバッグでは同じ結果が欲しいときがあります。その場合は random.seed(任意の整数)
を使うと、同じ順序の乱数が得られます。
import random
random.seed(123)
print(random.choice([1, 2, 3, 4, 5]))
# 常に同じ結果に固定される
まとめ
choice()
,choices()
,sample()
,shuffle()
を使い分けることで、ランダムに要素を取り出すあらゆるニーズに対応できます。- ランダムに要素を抽出するときは、「重複を許すか・許さないか」「もとのリストを変更していいか」などの要件をまずはっきりさせましょう。
- 大量のデータ生成やゲームの山札、実験データのシャッフルなど、多岐にわたる場面で活躍します。
Python でのランダム処理を自在に扱い、柔軟なデータ操作を行いましょう!