Zufälligkeit ist überall um uns herum. Wenn Sie eine Münze werfen oder einen Würfel werfen, können Sie nie sicher sein, wie das Endergebnis aussieht. Diese Unvorhersehbarkeit hat viele Anwendungen, wie das Bestimmen der Gewinner eines Glücksspiels oder das Generieren von Testfällen für ein Experiment mit zufälligen Werten, die auf einem Algorithmus basieren.
Unter Berücksichtigung dieser Nützlichkeit hat Python uns das Zufallsmodul zur Verfügung gestellt. Sie können es in Spielen verwenden, um Feinde zufällig zu erzeugen oder die Elemente in einer Liste neu zu mischen.
Fast alle Funktionen in diesem Modul hängen von der Grundausstattung ab zufällig()
Funktion, die ein zufälliges Float größer oder gleich null und kleiner als eins generiert. Python verwendet den Mersenne Twister, um die Floats zu generieren. Es produziert 53-Bit-Präzisionsschwimmer mit einer Periode von 2 ** 19937-1. Es ist tatsächlich der am häufigsten verwendete Allzweck-Pseudo-Zufallszahlengenerator.
Manchmal möchten Sie, dass der Zufallszahlengenerator die beim ersten Erstellen erstellte Zahlenfolge reproduziert. Dies kann dadurch erreicht werden, dass der Generator über den gleichen Startwert beide Male dem Generator zugeführt wird Samen (s, Version)
Funktion. Wenn der Parameter s weggelassen wird, verwendet der Generator die aktuelle Systemzeit, um die Zahlen zu generieren. Hier ist ein Beispiel:
import random.seed (100) random.random () # gibt 0.1456692551041303 random.random () # gibt 0.45492700451402135 zurück
Beachten Sie, dass das Modul im Gegensatz zu einem Münzwurf Pseudozufallszahlen generiert, die vollständig deterministisch sind und sich daher nicht für kryptographische Zwecke eignen.
Das Modul verfügt über zwei verschiedene Funktionen zum Generieren von Zufallszahlen. Sie können verwenden Bereich (a)
eine zufällige ganze Zahl kleiner als erzeugen ein
.
Ebenso können Sie verwenden Randbereich (a, b [, Schritt])
eine Zufallszahl aus generieren Bereich (a, b, Schritt)
. Zum Beispiel mit zufälliger Bereich (0, 100, 3)
gibt nur die Zahlen zwischen 0 und 100 zurück, die auch durch 3 teilbar sind.
Wenn Sie sowohl die untere als auch die obere Grenze kennen, zwischen der Sie die Zahlen generieren möchten, können Sie eine einfachere und intuitivere Funktion verwenden Randint (a, b)
. Es ist einfach ein Alias für Bereich (a, b + 1)
.
zufällig importieren random.randrange (100) # gibt 65 random.randrange (100) # ergibt 98 random.randrange (0, 100, 3) # gibt 33 random.randrange (0, 100, 3) # gibt 75 random.randint ( 1,6) # gibt 4 zufällig zurück. (1,6) # gibt 6 zurück
Um ein zufälliges Element aus einer bestimmten nicht leeren Sequenz auszuwählen, können Sie das verwenden Wahl (seq)
Funktion. Mit randint ()
, Sie sind auf eine Auswahl von Zahlen aus einem bestimmten Bereich beschränkt. Das Wahl (seq)
Mit dieser Funktion können Sie eine Nummer aus einer beliebigen Reihenfolge auswählen.
Eine weitere gute Sache über diese Funktion ist, dass sie nicht nur auf Zahlen beschränkt ist. Es kann beliebige Elemente aus einer Sequenz zufällig auswählen. Zum Beispiel kann der Name des Gewinners einer glücklichen Ziehung zwischen fünf verschiedenen Personen, die als Zeichenfolge bereitgestellt wird, mit dieser Funktion leicht ermittelt werden.
Wenn Sie eine Sequenz mischen möchten, anstatt ein zufälliges Element daraus auszuwählen, können Sie das verwenden mischen (seq)
Funktion. Dies führt zu einem an Ort und Stelle Mischen der Sequenz. Für eine Sequenz mit nur 10 (n) Elementen kann es insgesamt 3628800 (n!) Verschiedene Anordnungen geben. Bei einer größeren Sequenz ist die Anzahl der möglichen Permutationen sogar noch höher. Dies bedeutet, dass die Funktion niemals alle Permutationen einer großen Sequenz erzeugen kann.
Nehmen wir an, Sie müssen 50 Studenten aus einer Gruppe von 100 Studenten für eine Reise auswählen.
An diesem Punkt können Sie versucht sein, die Wahl (seq)
Funktion. Das Problem ist, dass Sie es im besten Fall etwa 50 Mal aufrufen müssen, wenn Sie nicht denselben Schüler erneut wählen.
Eine bessere Lösung ist die Verwendung der Probe (seq, k)
Funktion. Es wird eine Liste von angezeigt k eindeutige Elemente aus der angegebenen Reihenfolge. Die ursprüngliche Sequenz bleibt unverändert. Die Elemente in der Ergebnisliste werden in der Reihenfolge der Auswahl angezeigt. Ob k größer als die Anzahl der Elemente in der Sequenz selbst ist, wird ein ValueError ausgelöst.
import random ids = [1, 8, 10, 12, 15, 17, 25] random.choice (ids) # gibt 8 random.choice (ids) # liefert 15 Namen = ['Tom', 'Harry', 'Andrew ',' Robert '] random.choice (Namen) # gibt Tom random.choice (Namen) # gibt Robert random.shuffle (Namen) Namen zurück #' Robert ',' Andrew ',' Tom ',' Harry '] random.sample (Namen, 2) # liefert ['Andrew', 'Robert'] random.sample (Namen, 2) # liefert ['Tom', 'Robert'] Namen # gibt ['Robert', 'Andrew' zurück, "Tom", "Harry"]
Wie du siehst, mischen (seq)
hat die ursprüngliche Liste geändert, aber Probe (seq, k)
hielt es intakt.
In diesem Abschnitt lernen Sie Funktionen kennen, mit denen Zufallszahlen auf der Grundlage bestimmter Realwertverteilungen generiert werden können. Die Parameter der meisten dieser Funktionen werden nach der entsprechenden Variablen in der tatsächlichen Gleichung dieser Verteilung benannt.
Wenn Sie nur eine Zahl zwischen 0 und 1 wünschen, können Sie die verwenden zufällig()
Funktion. Wenn Sie möchten, dass die Nummer in einem bestimmten Bereich liegt, können Sie die verwenden Uniform (a, b)
Funktion mit ein und b als untere bzw. höhere Grenze.
Angenommen, Sie müssen eine Zufallszahl zwischen generieren niedrig und hoch so dass es eine höhere Wahrscheinlichkeit hat, in der Nähe einer anderen Nummer zu liegen Modus. Das können Sie mit der dreieckig (niedrig, hoch, Modus)
Funktion. Das niedrig und hoch Die Werte sind standardmäßig 0 und 1. Ebenso die Modus value ist standardmäßig auf den Mittelpunkt des niedrigen und des hohen Werts eingestellt, was zu einer symmetrischen Verteilung führt.
Es gibt viele andere Funktionen, um Zufallszahlen basierend auf verschiedenen Verteilungen zu generieren. Als Beispiel können Sie verwenden normalvariate (mu, sigma)
um eine Zufallszahl basierend auf einer Normalverteilung zu erzeugen, mit mu als gemein und Sigma als Standardabweichung.
import random random.random () # gibt 0.8053547502449923 random.random () # liefert 0.05966180559620815 random.uniform (1, 20) # gibt 11.970525425108205 random.uniform (1, 20) # ergibt 7.731292430291898 random.triangular (1, 100, 80) # gibt 42.328674062298816 random.triangular (1, 100, 80) zurück # gibt 73.54693076132074 zurück
Wie wir gerade gesehen haben, ist es möglich, Zufallszahlen mit gleichmäßiger Verteilung sowie Dreiecks- oder Normalverteilung zu erzeugen. Selbst in einem endlichen Bereich von 0 bis 100 können unendlich viele Floats generiert werden. Was ist, wenn es eine begrenzte Menge von Elementen gibt und Sie bei der Auswahl einer Zufallszahl bestimmten Werten mehr Gewicht verleihen möchten? Diese Situation ist in Lotteriesystemen üblich, in denen Zahlen mit geringer Belohnung eine hohe Gewichtung erhalten.
Wenn es für Ihre Anwendung akzeptabel ist, Gewichtungen zu haben, die ganzzahlige Werte sind, können Sie eine Liste von Elementen erstellen, deren Häufigkeit von deren Gewicht abhängt. Sie können dann die Wahl (seq)
Funktion zum zufälligen Auswählen eines Elements aus dieser gewichteten Liste. Hier ist ein Beispiel, das die Auswahl eines Gewinnbetrags nach dem Zufallsprinzip zeigt.
importiere zufällig w_prizes = [('$ 1', 300), ('$ 2', 50), ('$ 10', 5), ('$ 100', 1)] prize_list = [Preis für Preis, Gewicht in W_Preise für i in Bereich (Gewicht)] random.choice (prize_list) # gibt '$ 1' zurück
In meinem Fall brauchte ich zehn Versuche, um einen Preis von 2 $ aus der Liste zu erhalten. Die Chancen auf einen Preis von $ 100 wären viel geringer. In ähnlicher Weise können Sie auch anderen solchen Programmen Vorurteile hinzufügen.
Dieses Modul kann in vielen Situationen nützlich sein, z. B. beim Mischen der Fragen in einer Zuweisung oder beim Generieren von zufälligen Benutzernamen oder Passwörtern für Ihre Benutzer mithilfe von Mischen()
Funktion. Sie können auch Zufallszahlen einheitlich generieren und Zahlen in einem bestimmten Bereich gewichten. In unserem nächsten Lernprogramm verwenden wir die Funktionen dieses Moduls, um Zufallsdaten für die statistische Analyse zu generieren.
Haben Sie einige interessante Anwendungen von Zufallszahlengeneratoren vor Augen, die für Leser von Nutzen sein können? Lass es uns in den Kommentaren wissen.