random.choiceの加重バージョンを作成する必要がありました(リストの各要素は、選択される確率が異なります)。これは私が思いついたものです:
def weightedChoice(choices):
"""Like random.choice, but each element can have a different chance of
being selected.
choices can be any iterable containing iterables with two items each.
Technically, they can have more than two items, the rest will just be
ignored. The first item is the thing being chosen, the second item is
its weight. The weights can be any numeric values, what matters is the
relative differences between them.
"""
space = {}
current = 0
for choice, weight in choices:
if weight > 0:
space[current] = choice
current += weight
rand = random.uniform(0, current)
for key in sorted(space.keys() + [current]):
if rand < key:
return choice
choice = space[key]
return None
この機能は私には過度に複雑で醜く見えます。私はここのみんながそれを改善するか、これを行う別の方法についていくつかの提案を提供できることを望んでいます。コードの清潔さと読みやすさほど効率は重要ではありません。
random.choices
個々の呼び出しよりも桁違いに遅いです。ランダムな結果がたくさん必要な場合は、を調整して一度にすべてを選択することが非常に重要number_of_items_to_pick
です。そうすれば、桁違いに速くなります。