n
各要素が選択される確率を示す確率のリストを指定して、リスト内の要素をランダムに描画する最も効率的な方法を探しています。
aList = [3,4,2,1,4,3,5,7,6,4]
MyProba = [0.1,0.1,0.2,0,0.1,0,0.2,0,0.2,0.1]
これは、各描画で、最初の要素 (3) が描画される確率が 0.1 であることを意味します。もちろん、
sum(MyProba) == 1 # 常に True を返す len(aList) == len(MyProba) # 常に True を返す
今まで私は次のことをしました:
def random_pick(some_list, proba):
x = random.uniform(0, 1)
cumulative_proba = 0.0
for item, item_proba in zip(some_list, proba):
cumulative_proba += item_proba
if x < cumulative_proba:
break
return item
nb_draws = 10
list_of_drawn_elements = []
for one_draw in range(nb_draws):
list_of_drawn_elements.append(random_pick(aList, MyProba))
動作しますが、長いリストや大きな値の場合は非常に遅くなりますnb_draws
。このプロセスの速度を改善するにはどうすればよいですか?
注: 私が直面している特別なケースでは、nb_draws は常に の長さに等しくなりaList
ます。