Definir a probabilidade inicial de 0, e deixar as demais fixas
Para que o número máximo de vouchers sorteados fique na média de 10 por login, as chances de 1 voucher ser sorteado é de 0.2%.
Significa dizer que, a chance de ter 1 premiação começaria a aparecer para quem tem pelo menos 50 vouchers (ou 500 contratos pagos).
| Valores | Novas_Probabilidades |
|---|---|
| 0 | 0.998 |
| 5 | 0.180 |
| 10 | 0.010 |
| 25 | 0.000 |
| 50 | 0.000 |
| 100 | 0.000 |
0 significa não ser premiado, que, neste caso, é de 99.80% de probabilidade. A probabilidade de ser premiado é de 0.2%.
Com base nos dados de jul/2025, 91,84% dos logins terão entre 1 e 500 contratos pagos. Ou seja, o prêmio seria dividido entre apenas 9,15% dos logins.
Para eliminar este problema, precisamos ponderar as probababilidades de acordo com o volume de vouchers.
Ponderar a probabilidade de acordo com o acúmulo de premiações por pessoa
| Valores | Novas_Probabilidades |
|---|---|
| 0 | 0.50 |
| 5 | 45.92 |
| 10 | 3.05 |
| 25 | 0.59 |
| 50 | 0.30 |
| 100 | 0.14 |
Neste caso, a probabilidade inicial de não ser premiado é de 50%, e, por consequência, a ser premiado é de 50%.
Com as probabilidades ponderadas percebe-se que ainda existe uma relação entre “produzir mais x ganhar mais”, contudo, na forma ponderada, você já começa ganhando desde as primeiras giradas na roleta, significando, principalmente, 2 coisas:
I - Chances reais de ser premiado logo nas primeiras tentativas para quem tem poucos vouchers.
II - Manutenção da alta probabilidade de premiação (mas, respeitando o limite máximo) para quem tem muitos vouchers acumulados.
Isto dissiminará o investimento da campanha (que não mais será concentrado em 10% dos logins).
A probabilidades são definidas pela fórmula abaixo, que somente será ativada se a probabilidade de 0 determinada pela quantidade de premiações for maior ou igual a probabilidade inicial definida:
\[p_0(v) = p_0,base + (p_0, max - p_0,base) * (1 - e^{-k \cdot v})\]
Simplificando:
\[p_0(v) = p_0,base + (p_0, max - p_0,base) * (1 - exp(-k \cdot v))\]
Onde:
p_0,base: probabilidade inicial de 0
p_0,max: probabilidade máxima de 0
k: Taxa
v: número de premiações (soma do número de vouchers sorteados para o login)
Sugere-se encapsular a fórmula numa função que retorna as probabilidades que serão aplicadas à roleta, para cada login digitador.
Como parâmetro, a funçao vai receber o valor de ‘v’, que é o número de premiações (soma dos vouchers premiados acumulados na campanha do login digitador que está girando a roleta).
Retorna um array contendo as probabilidades associadas à cada possibilidade, no caso da roleta 0, 5, 10, 25, 50, 100.
Pseudo código
FUNÇÃO probs_roleta(vouchers):
// Declaração de variáveis e constantes
REFERENCIA = [44.97, 2.99, 0.58, 0.29, 0.14]
PROBABILIDADES_PREMIO = [0, 5, 10, 25, 50, 100] // Apenas para referência dos prêmios, não é usado na lógica
PROB0_INICIAL = 0.30
P0_MAXIMO = 0.99
K = 0.05
// Cálculo da nova probabilidade de obter 0
P0_NOVO = PROB0_INICIAL + (P0_MAXIMO - PROB0_INICIAL) * (1 - EXP(-K * vouchers))
// Cálculo do fator de ajuste para as outras probabilidades
SE P0_NOVO >= PROB0_INICIAL:
SOMA_OUTRAS_PROBS = SOMA(REFERENCIA)
FATOR_AJUSTE = (1 - P0_NOVO) / SOMA_OUTRAS_PROBS
// Cálculo das novas probabilidades para os outros prêmios
OUTRAS_PROBABILIDADES_NOVAS = []
PARA CADA prob EM REFERENCIA:
ADICIONAR (prob * FATOR_AJUSTE) À OUTRAS_PROBABILIDADES_NOVAS
// Montagem do vetor final de probabilidades
PROBABILIDADES_FINAIS = [P0_NOVO] + OUTRAS_PROBABILIDADES_NOVAS
SE NÃO:
FATOR_AJUSTE = (1 - PROB0_INICIAL) / SOMA_OUTRAS_PROBS
// Cálculo das novas probabilidades para os outros prêmios
OUTRAS_PROBABILIDADES_NOVAS = []
PARA CADA prob EM REFERENCIA:
ADICIONAR (prob * FATOR_AJUSTE) À OUTRAS_PROBABILIDADES_NOVAS
// Montagem do vetor final de probabilidades
PROBABILIDADES_FINAIS = [PROB0_INICIAL] + OUTRAS_PROBABILIDADES_NOVAS
// Retorno do resultado
RETORNAR PROBABILIDADES_FINAIS
FIM FUNÇÃO
Exemplo em python:
import math
def probs_roleta(v: int) -> list[float]:
"""
Calcula as probabilidades de prêmios em uma roleta com base no número de vouchers premiados.
Args:
v: O número de vouchers premiados que o jogador possui.
Returns:
Uma lista de floats contendo as novas probabilidades para cada prêmio.
"""
# Definindo constantes
referencia = [44.97, 2.99, 0.58, 0.29, 0.14]
prob0_inicial = 0.50
p0_maximo = 0.99
k = 1.5
# Calculando a nova probabilidade de obter 0
p0_novo = prob0_inicial + (p0_maximo - prob0_inicial) * (1 - math.exp(-k * v))
if p0_novo >= prob0_inicial:
# Calculando o fator de ajuste para as outras probabilidades
soma_outras_probs = sum(referencia)
fator_ajuste = (1 - p0_novo) / soma_outras_probs
# Calculando as novas probabilidades para os outros prêmios
outras_probs_novas = [prob * fator_ajuste for prob in referencia]
# Montando o vetor final de probabilidades
probabilidades_finais = [p0_novo] + outras_probs_novas
else:
soma_outras_probs = sum(referencia)
fator_ajuste = (1 - prob0_inicial) / soma_outras_probs
# Calculando as novas probabilidades para os outros prêmios
outras_probs_novas = [prob * fator_ajuste for prob in referencia]
# Montando o vetor final de probabilidades
probabilidades_finais = [prob0_inicial] + outras_probs_novas
return probabilidades_finais
# Exemplo de uso
vouchers_premiados = 2
probabilidades = probs_roleta(vouchers_exemplo)
Explicação
Supondo que a probabilidade inicial de 0 foi definida em 50%, e, que o parceiro girou a roleta 100 vezes.
| Voucher_sorteado | Valor_sorteado |
|---|---|
| 1 | 10 |
| 6 | 5 |
| 30 | 10 |
| 61 | 5 |
Ao girar a roleta sem nunca ter sido premiado, sua probabilidade é de 50% (conforme definido manualmente). Depois de ser sorteado a primeira vez, a probabilidade de ser sorteado novamente diminui; ao ser sorteado uma terceira vez, a probabilidade deminui mais ainda, e assim sucessivamente.
A calibragem da probabilidade inicial de 0, e do parâmetro k (taxa de decaimento) foi feita para que o número máximo de premiações (10 por login) apareça somente próximo aos 500 vouchers.
## [1] "No modelo de roleta proposto (o modelo ponderado), baseado nos dados do mês de julho/2025, teríamos um total de R$ 30125,00 distribuídos em 4884 vouchers sorteados."
1 - No modelo orginal, percebe-se que:
Se deixar a probabilidade de ganhar muito baixa (0,2%) apenas 10% dos logins terão reais condições de serem premiados;
Se aumentar a probabilidade de ganho para premiar os logins com menos vouchers, a campanha facilmente extrapolaria os limites financeiros do investimento na campanha;
2 - No modelo ajustado:
As probabilidades de ser premiado aumentam à medida que a produção também, entretanto, existem chances de 50% de ser premiado logo nos primeiros vouchers, devido a suavização do efeito linear da quantidade de vouchers implementada pela fórmula;
Há melhor diluição do investimento da campanha;
E possível limitar a quantidade máxima de premiações, mantendo a sensação de aleatoriedade;
Houve uma redução significativa do valor total da campanha, sendo possível postergar o período de vigência, ou, aumentar a probabilidade dos prêmios maiores.
3 - Após desenvolver a função, inputar os seguintes parâmetros:
sorteios = número de vouchers premiados.
prob0 = .50,
bones = c(0, 5, 10, 25, 50, 100),
referencia = c(44.97, 2.99, 0.58, 0.29, 0.14)
p0_max = .99,
k = 1.65
Conforme observação da documentação da campanha, foi definido o investimento de R$ 60.000,00. Para que se possa enquadrar a lógica do sorteio nos limites impostos, a campanha atingiu o o valor de aproximadamente R$ 31.000,00, metade do previsto.
Assim sendo, abrem-se 3 possibilidades:
1 - Aumentar ainda mais as chances de ser premiado inicialmente (atualmente definida em 50%), o que não se sugere;
2 - Aumentar a probabilidade de ser sorteado nos valores acima de R$ 5,00;
3 - Aumentar o período de vigência da campanha.