Ab Python v3.6
kann random.choices
ein list
Element mit der angegebenen Größe aus der angegebenen Grundgesamtheit mit optionalen Gewichten zurückgegeben werden.
random.choices(population, weights=None, *, cum_weights=None, k=1)
Bevölkerung : list
enthält einzigartige Beobachtungen. (Wenn leer, erhöht IndexError
)
Gewichte : Genauer gesagt sind relative Gewichte erforderlich, um eine Auswahl zu treffen.
cum_weights : kumulative Gewichte, die für die Auswahl erforderlich sind.
k : Größe ( len
) der list
auszugebenden. (Standard len()=1
)
Einige Vorsichtsmaßnahmen:
1) Es wird eine gewichtete Stichprobe mit Ersatz verwendet, damit die gezeichneten Gegenstände später ersetzt werden. Die Werte in der Gewichtssequenz an sich spielen keine Rolle, aber ihr relatives Verhältnis spielt eine Rolle.
Anders np.random.choice
als diejenigen, die nur Wahrscheinlichkeiten als Gewichte annehmen können und auch die Summierung einzelner Wahrscheinlichkeiten bis zu 1 Kriterium sicherstellen müssen, gibt es hier keine derartigen Regelungen. Solange sie zu numerischen Typen gehören ( int/float/fraction
außer Decimal
Typ), würden diese weiterhin funktionieren.
>>> import random
# weights being integers
>>> random.choices(["white", "green", "red"], [12, 12, 4], k=10)
['green', 'red', 'green', 'white', 'white', 'white', 'green', 'white', 'red', 'white']
# weights being floats
>>> random.choices(["white", "green", "red"], [.12, .12, .04], k=10)
['white', 'white', 'green', 'green', 'red', 'red', 'white', 'green', 'white', 'green']
# weights being fractions
>>> random.choices(["white", "green", "red"], [12/100, 12/100, 4/100], k=10)
['green', 'green', 'white', 'red', 'green', 'red', 'white', 'green', 'green', 'green']
2) Wenn weder Gewichte noch cum_weights angegeben sind, wird die Auswahl mit gleicher Wahrscheinlichkeit getroffen. Wenn eine Gewichtssequenz angegeben wird, muss sie dieselbe Länge wie die Populationssequenz haben .
Wenn Sie sowohl Gewichte als auch cum_weights angeben, wird a ausgelöstTypeError
.
>>> random.choices(["white", "green", "red"], k=10)
['white', 'white', 'green', 'red', 'red', 'red', 'white', 'white', 'white', 'green']
3) cum_weights sind normalerweise ein Ergebnis von itertools.accumulate
Funktionen, die in solchen Situationen sehr praktisch sind.
Aus der Dokumentation verlinkt:
Intern werden die relativen Gewichte vor der Auswahl in kumulative Gewichte umgewandelt, sodass die Bereitstellung der kumulativen Gewichte Arbeit spart.
Die Lieferung weights=[12, 12, 4]
oder cum_weights=[12, 24, 28]
für unseren erfundenen Fall führt also zu demselben Ergebnis, und letzteres scheint schneller / effizienter zu sein.
random.choices
bei einzelnen Anrufen. Wenn Sie viele zufällige Ergebnisse benötigen, ist es wirklich wichtig, alle auf einmal durch Anpassen auszuwählennumber_of_items_to_pick
. Wenn Sie dies tun, ist es eine Größenordnung schneller.