Die Funktionen choice(), sample() und choices() im random-Modul der Python-Standardbibliothek können verwendet werden, um Elemente aus einer Liste, einem Tupel, einer Zeichenkette oder einem anderen Sequenzobjekt zufällig auszuwählen und abzurufen (Zufallsstichproben).
choice() erhält ein einzelnes Element, sample() und choices() erhalten eine Liste mit mehreren Elementen. sample() ist eine nicht wiederherstellbare Extraktion ohne Duplikate, choices() ist eine wiederherstellbare Extraktion mit Duplikaten.
Hier finden Sie die folgenden Informationen.
- Wählen Sie ein Element nach dem Zufallsprinzip aus.:
random.choice()
- Zufällige Auswahl mehrerer Elemente (keine Duplikate):
random.sample()
- Zufällige Auswahl mehrerer Elemente (mit Duplikaten):
random.choices()
- Den Zufallszahlen-Seed festlegen
Wählen Sie ein Element nach dem Zufallsprinzip aus.: random.choice()
Mit der Funktion choose() des random-Moduls wird ein Element zufällig aus der Liste ausgewählt und kann abgerufen werden.
import random
l = [0, 1, 2, 3, 4]
print(random.choice(l))
# 1
Das Gleiche gilt für Tupel und Zeichenketten. Im Falle von Zeichenketten wird ein einzelnes Zeichen ausgewählt.
print(random.choice(('xxx', 'yyy', 'zzz')))
# yyy
print(random.choice('abcde'))
# b
Fehler, wenn eine leere Liste, ein leeres Tupel oder eine leere Zeichenkette als Argument angegeben wird.
# print(random.choice([]))
# IndexError: Cannot choose from an empty sequence
Zufällige Auswahl mehrerer Elemente (keine Duplikate): random.sample()
Mit der Funktion sample() des random-Moduls können Sie mehrere Elemente nach dem Zufallsprinzip aus einer Liste entnehmen. Es gibt keine Duplizierung von Elementen (nicht wiederherstellbare Extraktion).
Das erste Argument ist eine Liste, das zweite Argument ist die Anzahl der abzurufenden Elemente. Die Liste wird zurückgegeben.
import random
l = [0, 1, 2, 3, 4]
print(random.sample(l, 3))
# [2, 4, 0]
print(type(random.sample(l, 3)))
# <class 'list'>
Ist das zweite Argument auf 1 gesetzt, wird ebenfalls eine Liste mit einem Element zurückgegeben; ist es auf 0 gesetzt, ist die Liste leer. Ist das zweite Argument gleich 1, wird eine Liste mit einem Element zurückgegeben; ist es gleich 0, wird eine leere Liste zurückgegeben; ist das erste Argument größer als die Anzahl der Elemente in der Liste, tritt ein Fehler auf.
print(random.sample(l, 1))
# [3]
print(random.sample(l, 0))
# []
# print(random.sample(l, 10))
# ValueError: Sample larger than population or is negative
Wenn das erste Argument ein Tupel oder eine Zeichenkette ist, ist das Ergebnis immer noch eine Liste.
print(random.sample(('xxx', 'yyy', 'zzz'), 2))
# ['xxx', 'yyy']
print(random.sample('abcde', 2))
# ['b', 'e']
Wenn Sie zu einem Tupel oder einer Zeichenkette zurückkehren wollen, verwenden Sie tuple(),join().
print(tuple(random.sample(('xxx', 'yyy', 'zzz'), 2)))
# ('xxx', 'yyy')
print(''.join(random.sample('abcde', 2)))
# dc
Beachten Sie, dass der Wert nicht bewertet wird. Wenn die ursprüngliche Liste oder das Tupel Elemente mit demselben Wert enthält, besteht die Möglichkeit, dass derselbe Wert ausgewählt wird.
l_dup = [0, 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3]
print(random.sample(l_dup, 3))
# [3, 1, 1]
Wenn Sie doppelte Werte vermeiden wollen, können Sie set() verwenden, um sie in eine Menge (vom Typ set) umzuwandeln und nur die eindeutigen Elemente zu extrahieren, und dann sample() verwenden.
print(set(l_dup))
# {0, 1, 2, 3}
print(random.sample(set(l_dup), 3))
# [1, 3, 2]
Zufällige Auswahl mehrerer Elemente (mit Duplikaten): random.choices()
Mit der Funktion choices() des random-Moduls können Sie mehrere Elemente nach dem Zufallsprinzip aus einer Liste abrufen, und im Gegensatz zu sample() können auch doppelte Elemente ausgewählt werden.
choices() ist eine Funktion, die in Python 3.6 hinzugefügt wurde. Sie ist in früheren Versionen nicht verfügbar.
Das Argument k gibt die Anzahl der abzurufenden Elemente an. Duplizierung ist erlaubt, so dass die Anzahl der abzurufenden Elemente größer sein kann als die Anzahl der Elemente in der ursprünglichen Liste.
Da k ein reines Schlüsselwortargument ist, muss ein Schlüsselwort angegeben werden, z. B. k=3.
import random
l = [0, 1, 2, 3, 4]
print(random.choices(l, k=3))
# [2, 1, 0]
print(random.choices(l, k=10))
# [3, 4, 1, 4, 4, 2, 0, 4, 2, 0]
Der Standardwert für k ist 1; wird er weggelassen, wird eine Liste mit 1 Element zurückgegeben.
print(random.choices(l))
# [1]
Mit dem Argument weights kann das Gewicht (die Wahrscheinlichkeit) angegeben werden, dass jedes Element ausgewählt wird, und der Typ der Elemente in der Liste kann int oder float sein.
print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1]))
# [0, 2, 3]
print(random.choices(l, k=3, weights=[1, 1, 0, 0, 0]))
# [0, 1, 1]
Das Argument cum_weights kann auch als kumulative Gewichtung angegeben werden. Das Argument cum_weights im folgenden Beispielcode entspricht den oben genannten ersten Gewichten.
print(random.choices(l, k=3, cum_weights=[1, 2, 3, 13, 14]))
# [3, 2, 3]
Die Standardeinstellung für die beiden Argumente weights und cum_weights ist None, was bedeutet, dass jedes Element mit der gleichen Wahrscheinlichkeit ausgewählt wird.
Wenn die Länge (Anzahl der Elemente) des Arguments weights oder cum_weights von der ursprünglichen Liste abweicht, tritt ein Fehler auf.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1, 1, 1]))
# ValueError: The number of weights does not match the population_
Es ist auch ein Fehler, Gewichte und cum_weights gleichzeitig anzugeben.
# print(random.choices(l, k=3, weights=[1, 1, 1, 10, 1], cum_weights=[1, 2, 3, 13, 14]))
# TypeError: Cannot specify both weights and cumulative weights
Im bisherigen Beispielcode haben wir eine Liste als erstes Argument angegeben, aber das Gleiche gilt für Tupel und Strings.
Den Zufallszahlen-Seed festlegen
Durch Übergabe einer beliebigen ganzen Zahl an die Funktion seed() des Zufallsmoduls kann der Zufallszahlen-Seed festgelegt und der Zufallszahlengenerator initialisiert werden.
Nach der Initialisierung mit demselben Seed werden die Elemente immer auf dieselbe Weise ausgewählt.
random.seed(0)
print(random.choice(l))
# 3
random.seed(0)
print(random.choice(l))
# 3