Random.choice (listedeki her öğenin seçilme olasılığı farklıdır) ağırlıklı bir sürümünü yazmak gerekiyordu. Ben geldi budur:
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
Bu işlev benim için aşırı karmaşık ve çirkin görünüyor. Buradaki herkesin iyileştirilmesi veya bunu yapmanın alternatif yolları hakkında bazı önerilerde bulunabileceğini umuyorum. Verimlilik benim için kod temizliği ve okunabilirliği kadar önemli değil.
random.choices
bireysel aramalardan daha yavaş bir büyüklük sırasıdır . Çok fazla rastgele sonuca ihtiyacınız varsa, bunları ayarlayarak hepsini bir kerede seçmek gerçekten önemlidirnumber_of_items_to_pick
. Bunu yaparsanız, daha hızlı bir büyüklük sırasıdır.