Gewichtete Stichprobe in Python

Ich suche nach einer vernünftigen Definition einer Funktion weighted_sample , die nicht nur einen zufälligen Index für eine Liste der angegebenen Gewichte zurückgibt (was wäre so etwas wie

 def weighted_choice(weights, random=random): """ Given a list of weights [w_0, w_1, ..., w_n-1], return an index i in range(n) with probability proportional to w_i. """ rnd = random.random() * sum(weights) for i, w in enumerate(weights): if w<0: raise ValueError("Negative weight encountered.") rnd -= w if rnd < 0: return i raise ValueError("Sum of weights is not positive") 

Um eine kategorische Verteilung mit konstanten Gewichten zu geben), sondern eine zufällige Stichprobe von k von denen, ohne Ersatz , genauso wie random.sample verhält sich im Vergleich zu random.choice .

So wie weighted_choice geschrieben werden kann

 lambda weights: random.choice([val for val, cnt in enumerate(weights) for i in range(cnt)]) 

weighted_sample könnte als geschrieben werden

 lambda weights, k: random.sample([val for val, cnt in enumerate(weights) for i in range(cnt)], k) 

Aber ich möchte eine Lösung, die es nicht erfordert, die Gewichte in eine (möglicherweise riesige) Liste zu enträtseln.

Bearbeiten: Wenn es irgendwelche netten Algorithmen gibt, die mir ein Histogramm / eine Liste von Frequenzen (im selben Format wie die Argumentgewichte) anstelle einer Sequenz von Indizes geben, wäre das auch sehr nützlich.

  • Python - Nach dem Zufallsprinzip Wörter auswählen, die in einem Quiz angezeigt werden sollen
  • Generieren Sie zufällige Zahlen, die die beliebige Verteilung replizieren
  • Generieren zufällige Wörter
  • Implementierung eines Pseudozufallsgenerators in Python
  • Den Benutzer fragen, ob sie wieder spielen wollen
  • Generiere mehrere zufällige Zahlen, um einen Wert in Python zu entsprechen
  • Python-Zufallssequenz mit Samen
  • Python entfernen Sie ein Element aus einer zufälligen Liste, nachdem sie ausgewählt wurden
  • Erstellen Sie Zufallszahl innerhalb eines Annulus
  • Generiere ein zufälliges Datum zwischen zwei anderen Terminen
  • Wie würde ich einen zufälligen Hexdigit-Code-Generator mit .join und für Loops machen?
  • Python ist die beste Programmiersprache der Welt.