Pythonでリストの要素をランダムにシャッフルしたい時は、次の方法があります。
- random.shuffle()関数
- random.sample()関数
前者は元のリストをシャッフルして、後者は要素をシャッフルした新しいリストを作ります。まずはこの2つについて解説します。
その後、機械学習の性能評価などで常に同じシャッフル結果を使いたい場合に、乱数を固定するrandom.seed()関数についても解説します。
1. random.shuffle()関数
random.shuffle()関数は、引数に渡したリストの要素をシャッフルします。要素をシャッフルした新しいリストを作るのではなくて、元のリストをシャッフルします。
random.shuffle()を使うには、乱数を作成するrandomモジュールをインポートしておく必要があります。モジュールについては「Pythonのモジュールについて」で解説しています。
import random # 最初にrandomモジュールをインポート
nums = [0, 1, 2, 3, 4]
random.shuffle(nums)
print(nums)
random.shuffle()は、引数に渡したリストに変更を加えるもののため、関数の実行結果を出力してもNoneになります。
print(random.shuffle(nums))
2. random.sample()関数
random.sample()関数もリストの要素をシャッフルするものですが、random.shuffle()関数とは次の2点が異なります。
- 引数に渡したリストの要素をシャッフルした新しいリストを作る
- 第二引数でリストの要素を何個取り出すかを指定する
実際に見てみましょう。
以下の例では、第二引数に「len(nums)」を書いて全部の要素をシャッフルして取り出しています。len()関数は「Pythonのリストの要素数を確認する方法」で解説しています。
import random
nums = [0, 1, 2, 3, 4]
nums_shuffled = random.sample(nums, len(nums))
print(nums_shuffled)
第二引数で指定した数だけ要素をランダムに取り出します。
import random
nums = [0, 1, 2, 3, 4]
two_nums = random.sample(nums, 2)
print(two_nums)
three_nums = random.sample(nums, 3)
print(three_nums)
3. random.seed()関数
random.shuffle()もrandom.sample()も、実行する度に、ランダムに要素をシャッフルします。
しかし時には、機械学習などの性能評価の時に、乱数を固定しておきたいという場合もあります。そんな場合はrandom.seed()関数を使います。
random.seed()関数の引数に任意の数値を入れて実行してから、random.shuffle()やrandom.sample()を使うと、毎回同じシャッフル結果を得ることができます。
まず次のシャッフル結果をご覧ください。
nums = [0, 1, 2, 3, 4]
random.seed(0) # これで乱数を固定しています。
random.shuffle(nums)
print(f'シャッフル1回目:{nums}')
random.shuffle(nums)
print(f'シャッフル2回目:{nums}')
random.shuffle(nums)
print(f'シャッフル3回目:{nums}')
以下は、上とは別にもう一度random.shuffle()を実行したものですが、1, 2, 3回目とも、上と同じ出力結果になっていますね。
nums = [0, 1, 2, 3, 4]
random.seed(0) # これで上と同じ乱数になる。
random.shuffle(nums)
print(f'シャッフル1回目:{nums}')
random.shuffle(nums)
print(f'シャッフル2回目:{nums}')
random.shuffle(nums)
print(f'シャッフル3回目:{nums}')
4. まとめ
ポイントをまとめておきます。
random.shuffle()関数は、引数に渡したリストをシャッフルします。
random.sample()関数は、第一引数に渡したリストの要素をランダムに取り出して新しいリストを作ります。第二引数で必ず取り出す要素の数を指定する必要があります。
最後に、シャッフルの乱数を固定するには、random.seed()関数を使います。
コメント