Pythonのランダム操作:choice, choices, sample, shuffleを徹底解説

2025-01-31

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. 1 要素だけランダムに取りたい
    random.choice()
  2. 重複を許しながら複数要素を選びたい
    random.choices(seq, k=n)
  3. 重複を許さずに複数要素を選びたい
    random.sample(seq, k=n)
  4. シーケンスそのものをランダムな順序に並べ替えたい
    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 でのランダム処理を自在に扱い、柔軟なデータ操作を行いましょう!