最初に頭に浮かぶのは、それらを並べ替えて合計することです。
あなたが私のアドバイスに従って、辞書の構造を次のように変更したとしましょう。
mychoice = {2: 0.7, 1: 0.2, 3: 0.1}
累積された重みで dict を作成しましょう。
temp = sorted(((v, w) for v, w in mychoice.items()), key = lambda x: x[1], reverse = True)
accum = [(val[0], sum(_[1] for _ in temp[:i+1])) for i, val in enumerate(temp)]
(それは少し厄介です、誰かが最適化できますか?)
とにかく、今あなたaccum
は[(2, 0.7), (1, 0.9), (3, 1)]
そう:
r = random.random()
for vw in accum:
if vw[1] > r:
print vw[0]
break
編集: astynax が巧みに指摘しているように、蓄積された確率のリストはとにかくソートされるため、重みをソートする必要はありません。
したがって、必要なものは次のとおりです。
accum = ((k, sum(mychoice.values()[:i]))
for i, k in enumerate(mychoice.keys(), 1))
次に、ランダムな値を生成し、前と同じ方法で結果を取得します。