A solução conceitualmente mais simples seria criar uma lista em que cada elemento ocorre tantas vezes quanto seu peso, então
fruits = [apple, apple, apple, apple, orange, orange, lemon]
Em seguida, use as funções que você tem à sua disposição para escolher um elemento aleatório dessa lista (por exemplo, gerar um índice aleatório dentro do intervalo adequado). Obviamente, isso não é muito eficiente em termos de memória e requer pesos inteiros.
Outra abordagem um pouco mais complicada ficaria assim:
-
Calcule as somas cumulativas de pesos:
intervals = [4, 6, 7]
Onde um índice abaixo de 4 representa uma maçã , 4 abaixo de 6 e laranja e 6 a abaixo de 7 a limão .
-
Gere um número aleatório
n
no intervalo de0
asum(weights)
. - Encontre o último item cuja soma acumulativa está acima de
n
. A fruta correspondente é o seu resultado.
Esta abordagem requer um código mais complicado do que o primeiro, mas menos memória e computação e suporta pesos de ponto flutuante.
Para qualquer algoritmo, a etapa de configuração pode ser feita uma vez para um número arbitrário de seleções aleatórias.