Ab Python v3.6kann random.choicesein listElement 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 : listenthä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 listauszugebenden. (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.choiceals 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/fractionaußer DecimalTyp), 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.accumulateFunktionen, 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.choicesbei 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.