Pythonでは、リストからランダムに要素を選択するための標準的な関数としてrandom.choice
があります。しかし、この関数はすべての要素が等しい確率で選ばれるという前提があります。一方で、リストの各要素が異なる確率で選ばれるような「重み付きランダム選択」を行いたい場合はどうすればよいでしょうか?
Python 3.6以降では、random.choices
関数を使用することで重み付きランダム選択を行うことができます。この関数は、選択される各要素の確率を指定することが可能です。
以下に、random.choices
関数を使用した重み付きランダム選択の例を示します。
import random
# 選択肢とそれぞれの重み
choices = ['red', 'blue', 'green']
weights = [10, 3, 1]
# 重み付きランダム選択
selected = random.choices(choices, weights, k=1)
print(selected)
このコードでは、’red’が10/14の確率、’blue’が3/14の確率、’green’が1/14の確率で選ばれます。
また、NumPyのnumpy.random.choice
関数でも同様のことが可能です。以下にその例を示します。
import numpy as np
# 選択肢とそれぞれの重み
choices = np.array(['red', 'blue', 'green'])
weights = np.array([10, 3, 1])
# 重みの合計が1になるように正規化
weights = weights / np.sum(weights)
# 重み付きランダム選択
selected = np.random.choice(choices, p=weights)
print(selected)
このコードでも、’red’が10/14の確率、’blue’が3/14の確率、’green’が1/14の確率で選ばれます。
以上、Pythonで重み付きランダム選択を行う方法について説明しました。これらの関数を活用することで、より柔軟なランダム選択が可能となります。ぜひ試してみてください。