2021年6月30日水曜日

【標準ライブラリ】randomによる要素の抽出・シャッフル

 標準ライブラリrandomchoicechoicessampleを用いるとリスト等から要素をランダムに抽出できる。また、shuffleにより要素をシャッフルできる。

ライブラリrandomを使う際にはimportが必要。

import random


1. ランダムに要素を抽出するchoice

 choiceはリストやタプルなどから要素を1つランダムに抽出する。

import random

x = [2, 5, 8, 9]
random.choice(x)

実行結果

8


 リストやタプルが空の場合はIndexErrorとなる。

import random

x = []
random.choice(x)

実行結果

IndexError: Cannot choose from an empty sequence


2. 複数の要素を重複ありで抽出するchoices

 choicesは母集団populationから重複ありで選んだ要素からなる大きさkのリストを返す。

random.choices(population, weights=None, *, cum_weights=None, k=1)

 要素7つのタプルから重複ありで要素4のリストを作る場合。

import random

x = (2, 5, 8, 9, 11, 15, 17)
random.choices(x, k=4)

実行結果

[8, 11, 8, 17]


 weightを指定すると要素ごとに選択する確率に重みを付けられる。weightはリストで指定してその要素数はpopulationの要素数と同じにする。
'A', 'B', 'C', 'D'を1倍、'E', 'F'を2倍、'G'を4倍の重みづけにした場合。確率の高い'G'が多く選ばれる。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.choices(x, weights=[1,1,1,1,2,2,8], k=4)

実行結果

['G', 'G', 'G', 'D']


 cum_weightも同様に確率に重みを付けられる。リストの値は各要素の重みづけの累積値となる。
上の例と同じ、'A', 'B', 'C', 'D'を1倍、'E', 'F'を2倍、'G'を4倍の重みづけにする場合。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.choices(x, cum_weights=[1,2,3,4,6,8,16], k=4)

実行結果

['E', 'F', 'G', 'G']


3. 複数の要素を重複なしで抽出するsample

 sampleは母集団populationから重複なしで選んだ要素からなる大きさkのリストを返す。
kの値はpopulationの要素数以下でないといけない。

random.sample(population, k, *)


 要素7つのタプルから重複なしで要素4のリストを作る場合。

import random

x = (2, 5, 8, 9, 11, 15, 17)
random.sample(x, k=4)

実行結果

[2, 9, 17, 8]


 samplerangeと組み合わせることで、連続する数の集合からランダムなサンプリングができる。
0~99の数字から10要素を重複なく選択する場合。

import random

random.sample(range(100), k=10)

実行結果

[3, 85, 90, 1, 4, 78, 21, 28, 51, 37]


4. 要素をランダムに並べ替えるshuffle

 shuffleは要素の順番をランダムに入れ替える。

random.shuffle(x[, random])


リストを並べ替える場合。

import random

x = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
random.shuffle(x)
x

実行結果

['C', 'A', 'F', 'D', 'E', 'G', 'B']


 タプルはイミュータブル(変更できない)のでshuffleするとエラーとなる。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.shuffle(x)
x

実行結果

TypeError: 'tuple' object does not support item assignment


 タプルを並べ替える場合はsample(x, k=len(x))とする。

import random

x = ('A', 'B', 'C', 'D', 'E', 'F', 'G')
random.sample(x, k=len(x))

実行結果

['F', 'G', 'C', 'D', 'B', 'A', 'E']


5. リファレンス

Python 標準ライブラリ > random --- 擬似乱数を生成する > シーケンス用の関数

使用バージョン:Python 3.7.0

0 件のコメント:

コメントを投稿