Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Zufallsmoduls, des gewichteten Zufallsalgorithmus und der Implementierungsmethode von Python

Detaillierte Erläuterung des Zufallsmoduls, des gewichteten Zufallsalgorithmus und der Implementierungsmethode von Python

高洛峰
高洛峰Original
2017-03-24 17:09:412910Durchsuche

zufällig wird verwendet, um Zufallszahlen zu generieren. Wir können es verwenden, um zufällig Zahlen zu generieren oder Zeichenfolgen auszuwählen.
•random.seed(x) ändert den Startwert des Zufallszahlengenerators . Im Allgemeinen ist es nicht erforderlich, den Startwert speziell festzulegen.
Python wählt den Startwert automatisch aus. •random.random() wird verwendet, um eine zufällige Gleitkommazahl n,0 <= n < 1 zu generieren
•random.uniform(a,b) wird verwendet, um eine zufällige Gleitkommazahl innerhalb zu generieren ein angegebener Bereich, generierte zufällige
Ganzzahl a<=n<=b;•random.randint(a,b) wird verwendet, um eine Ganzzahl innerhalb eines angegebenen Bereichs zu generieren, a ist die Untergrenze, b ist die Obergrenze, die generierte Zufallszahl a<=n<=b; wenn a=b, dann n=a, wenn a>b, Fehler
•random.rand
range( start], stop [,step] ) Ruft eine Zufallszahl aus der Menge im angegebenen Bereich [start, stop] ab und erhöht sie um die angegebene Basis. Der Standardwert der Basis ist 1•random.choice(sequence). Holen Sie sich ein zufälliges Element aus der Sequenz. Die Parametersequenz stellt einen geordneten Typ dar, keinen bestimmten Typ. Er bezieht sich im Allgemeinen auf
Liste, Tupel, Zeichenfolge usw. •zufällig.
Shuffle(x[,random]) wird zum Mischen (Mischen) der Elemente in einer Liste verwendet, um die ursprüngliche Liste zu ändern•random.sample(sequence,k) Ruft zufällig k Elemente aus der angegebenen Sequenz ab und gibt sie als zurück Fragment, ohne die ursprüngliche Sequenz zu ändern
Da wir nun über das Grundwissen verfügen, implementieren wir einen gewichteten Zufallsalgorithmus:
Der gewichtete Zufallsalgorithmus wird im Allgemeinen in den folgenden Szenarien verwendet: Es gibt eine Menge S, die vier Elemente enthält , wie A, B, C und D. Zu diesem Zeitpunkt möchten wir zufällig einen Gegenstand daraus ziehen, aber die Wahrscheinlichkeit, A zu ziehen, ist unterschiedlich. Wir hoffen beispielsweise, dass die Wahrscheinlichkeit, A zu ziehen, 50 % beträgt, die Wahrscheinlichkeit, B und C zu ziehen, 20 % Die Wahrscheinlichkeit, D zu ziehen, beträgt 10 %. Im Allgemeinen können wir jedem Gegenstand ein Gewicht zuweisen, und die Extraktionswahrscheinlichkeit ist proportional zu diesem Gewicht. Dann wird die obige Menge zu:
{A:5, B:2, C:2, D:1}

Methode 1: Die einfachste Methode kann so sein:
Erweitern Sie die Sequenz entsprechend dem Gewichtungswert in: Listen=[A,A,A,A,A,B,B,C,C,D] und wählen Sie dann zufällig eine mit random.choice(lists) aus. Obwohl die zeitliche Komplexität dieser Auswahl O (1) beträgt, ist die Datenmenge groß und der Speicherplatzverbrauch zu groß.

# coding:utf-8
import random
def weight_choice(list, weight):
  """
  :param list: 待选取序列
  :param weight: list对应的权重序列
  :return:选取的值
  """
  new_list = []
  for i, val in enumerate(list):
    new_list.extend(val * weight[i])
  return random.choice(new_list)
if name == "main":
  print(weight_choice(['A', 'B', 'C', 'D'], [5, 2, 2, 1]))


Methode 2: Die gebräuchlichere Methode ist diese:
Berechnen Sie die Summe der Gewichte und wählen Sie dann zufällig eine Zahl zwischen 1 und Summe aus R, durchqueren Sie dann die gesamte Sammlung und zählen Sie die Summe der Gewichte der durchquerten Elemente. Wenn sie größer oder gleich R ist, beenden Sie die Durchquerung und wählen Sie die angetroffenen Elemente aus.
Am Beispiel des obigen Satzes ist die Summe gleich 10. Wenn die Zufallszahl 1-5 ist, wird der Durchlauf beendet, wenn die erste Zahl durchquert wird. im Einklang mit der gewählten Wahrscheinlichkeit.
Bei der Auswahl müssen Sie die Sammlung durchlaufen, und ihre zeitliche Komplexität beträgt O(n).

# coding:utf-8
import random
list = ['A', 'B', 'C', 'D']
def weight_choice(weight):
  """
  :param weight: list对应的权重序列
  :return:选取的值在原列表里的索引
  """
  t = random.randint(0, sum(weight) - 1)
  for i, val in enumerate(weight):
    t -= val
    if t < 0:
      return i
if name == "main":
  print(list[weight_choice([5, 2, 2, 1])])


Methode 3: Sie können die Originalsequenz zunächst nach Gewicht sortieren. Bei dieser Durchquerung können Gegenstände mit hoher Wahrscheinlichkeit schnell angetroffen werden, wodurch die Anzahl der zu durchquerenden Gegenstände verringert wird. (Da rnd am schnellsten dekrementiert (subtrahieren Sie zuerst die größte Zahl))
Vergleichen Sie {A:5, B:2, C:2, D:1} und {B:2, C:2, A: 5, D : 1}
Die Erwartung der Anzahl der Durchlaufschritte für ersteres beträgt 5/10*1+2/10*2+2/10*3+1/10*4=19/10, während die Erwartung für das Letzteres ist 2/10* 1+2/10*2+5/10*3+1/10*4=25/10.
Dies verbessert die durchschnittliche Auswahlgeschwindigkeit, aber das Sortieren der Originalsequenz nimmt auch Zeit in Anspruch.
Erstellen Sie zunächst ein Präfix und eine Folge von Gewichtswerten. Nachdem Sie dann eine Zufallszahl t generiert haben, können Sie diese mithilfe der Dichotomiemethode aus diesem Präfix und dieser Folge ermitteln. Die zeitliche Komplexität der Auswahl beträgt dann O (logn).

# coding:utf-8
import random
import bisect
list = ['A', 'B', 'C', 'D']
def weight_choice(weight):
  """
  :param weight: list对应的权重序列
  :return:选取的值在原列表里的索引
  """
  weight_sum = []
  sum = 0
  for a in weight:
    sum += a
    weight_sum.append(sum)
  t = random.randint(0, sum - 1)
  return bisect.bisect_right(weight_sum, t)
if name == "main":
  print(list[weight_choice([5, 2, 2, 1])])

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Zufallsmoduls, des gewichteten Zufallsalgorithmus und der Implementierungsmethode von Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn