Escolher aleatoriamente de uma lista com probabilidades ponderadas

Eu tenho uma matriz de N elementos (representando as letras N de um determinado alfabeto), e cada célula da matriz contém um valor inteiro, esse valor inteiro que significa o número de ocorrências em um determinado texto dessa letra. Agora eu quero escolher aleatoriamente uma letra de todas as letras do alfabeto, com base no seu número de aparições com as restrições dadas:

Se a letra tiver um valor positivo (diferente de zero), então ela pode ser sempre escolhida pelo algoritmo (com uma probabilidade maior ou menor, é claro).

Se uma letra A tem um valor maior que uma letra B, então é mais provável que ela seja escolhida pelo algoritmo.

Agora, levando isso em conta, eu inventei um algoritmo simples que poderia fazer o trabalho, mas eu estava apenas imaginando se havia algo melhor para fazer. Isso parece ser bastante fundamental, e acho que pode haver coisas mais inteligentes para se fazer isso de maneira mais eficiente. Este é o algoritmo que eu pensei:

Some todas as freqüências da matriz. Armazenar em SUMEscolhendo um valor aleatório de 0 para SUM. Guarde-o em RAN[While] RAN> 0, Começando do primeiro, visite cada célula no array (em ordem), e subtraia o valor daquela célula do RANA última célula visitada é a escolhida

Então, há algo melhor para fazer do que isso? Estou esquecendo de algo?

Eu sei que a maioria dos computadores modernos pode calcular isso tão rápido que nem mesmo notarei se meu algoritmo é ineficiente, então isso é mais uma questão teórica do que prática.

Eu prefiro um algoritmo explicado em vez de apenas um código para uma resposta, mas se você estiver mais confortável em fornecer sua resposta em código, não tenho nenhum problema com isso.

questionAnswers(2)

yourAnswerToTheQuestion