Zufällige Auswahl aus einer Liste mit gewichteten Wahrscheinlichkeiten

Ich habe ein Array von N Elementen (die die N Buchstaben eines gegebenen Alphabets darstellen), und jede Zelle des Arrays enthält einen ganzzahligen Wert, wobei dieser ganzzahlige Wert die Anzahl der Vorkommen in einem gegebenen Text dieses Buchstabens bedeutet. Jetzt möchte ich zufällig einen Buchstaben aus allen Buchstaben des Alphabets auswählen, basierend auf der Anzahl seiner Auftritte mit den angegebenen Einschränkungen:

Wenn der Buchstabe einen positiven Wert (ungleich Null) hat, kann er immer vom Algorithmus ausgewählt werden (natürlich mit einer größeren oder kleineren Wahrscheinlichkeit).

Wenn ein Buchstabe A einen höheren Wert als ein Buchstabe B hat, muss es wahrscheinlicher sein, dass er vom Algorithmus ausgewählt wird.

In Anbetracht dessen habe ich mir einen einfachen Algorithmus ausgedacht, der den Job erledigen könnte, aber ich habe mich nur gefragt, ob es etwas Besseres gibt. Dies scheint von grundlegender Bedeutung zu sein, und ich denke, es gibt klügere Dinge zu tun, um dies effizienter zu erreichen. Dies ist der Algorithmus, den ich dachte:

Addieren Sie alle Frequenzen im Array. Speichern Sie es in SUMZufälligen Wert von 0 bis SUM wählen. Speichern Sie es in RAN[While] RAN> 0: Besuchen Sie von Anfang an jede Zelle im Array (in der angegebenen Reihenfolge) und subtrahieren Sie den Wert dieser Zelle vom RANDie zuletzt besuchte Zelle ist die ausgewählte

Gibt es etwas Besseres als dies? Vermisse ich etwas?

Ich bin mir bewusst, dass die meisten modernen Computer dies so schnell berechnen können, dass ich nicht einmal bemerke, ob mein Algorithmus ineffizient ist. Dies ist also eher eine theoretische als eine praktische Frage.

Ich bevorzuge einen erklärten Algorithmus anstatt nur Code für eine Antwort, aber wenn Sie es bequemer haben, Ihre Antwort im Code zu geben, habe ich kein Problem damit.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage