Adquira o hábito de escrever juntos! Este é o 11º dia que participo do "Nuggets Daily New Plan · April Update Challenge", clique para ver os detalhes do evento .
Sorteio da Roda Grande
O sorteio é uma ferramenta de marketing comumente usada. A atividade da loteria existe há muitos anos e foi adotada por todas as esferas da vida porque se encaixa na psicologia do consumo das pessoas. Para os consumidores, "tirar vantagem" é a busca eterna, e "pequeno e grande" também satisfaz a busca de entusiasmo dos clientes. Além disso, em comparação com outras formas de atividades, a grande atividade de loteria giratória é simples de operar, altamente interessante, atrai usuários com uma ampla gama de prêmios e tem um alto grau de participação.
A loteria carrossel é frequentemente usada para enviar formulários, e a loteria atrai drenagem direcional. Pague para completar o pedido, tire uma loteria para dar recompensas probabilísticas ou drenagem direcional.
algoritmo de loteria
A ideia básica do algoritmo de loteria é randomizar um número e ver em qual intervalo o número aleatório se enquadra.
Existem três prêmios A, B e C, a probabilidade é de 10, 20 e 30 em 10.000 respectivamente. Então a probabilidade de agradecer por participar de D (também como prêmio) é 10000-10-20-30;
0__ 10 __ 30__60__10000
o intervalo vencedor
R: [0,10]
B: [10,30]
C: [30,60]
D: [60,10000]
random Um número aleatório de 0 a 10.000, em qual intervalo se enquadra, ou seja, qual prêmio é ganho.
código de implementação
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
/**
* @author lvzihai
* @date 2022/4/15
**/
public class LotteryA {
private static int draw(){
int totalCount = 10000;
int pa = 10;
int pb = 20;
int pc = 30;
// 谢谢参与
int pd = totalCount -pa-pb-pc;
int[] gifts = new int[]{pa,pb,pc,pd};
int[] giftRange = new int[gifts.length];
int sum = 0;
for (int i = 0; i < gifts.length; i++) {
sum+=gifts[i];
giftRange[i] = sum;
}
StrUtil s;
int randomVal = RandomUtil.randomInt(totalCount);
for (int i = 0; i < giftRange.length; i++) {
if(randomVal<giftRange[i]){
return i;
}
}
return -1;
}
public static void main (String[] args) {
Map<Integer,Integer> map = new HashMap<>();
int totalCount = 100000;
for (int i = 0; i < totalCount; i++) {
int index = draw();
Integer val = map.get(index);
val = val==null?1:val+1;
map.put(index,val);
}
// 统计概率 万分之X
for (Entry<Integer, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey()+" "+10000.0*entry.getValue()/totalCount);
}
}
}
复制代码
Algoritmos cuja probabilidade total não é 1
Para algoritmos melhorados cuja probabilidade total não é 1. Por exemplo, probabilidade: A: 0,1 B: 0,2, C: 0,3, D: 0,6, some todas as probabilidades para obter a probabilidade total e, em seguida, calcule a probabilidade relativa de cada item.
将随机值添加到序列并排序,通过indexOf来获取随机值所在的区间
List<Double> orignalRates = Arrays.asList(0.1,0.2,0.3,0.6);
public static int lottery (List<Double> orignalRates) {
if (orignalRates == null || orignalRates.isEmpty()) {
return -1;
}
int size = orignalRates.size();
// 计算总概率,这样可以保证不一定总概率是1
double sumRate = 0d;
for (double rate : orignalRates) {
sumRate += rate;
}
// 计算每个物品在总概率的基础下的概率情况
List<Double> sortOrignalRates = new ArrayList<Double>(size);
Double tempSumRate = 0d;
for (double rate : orignalRates) {
tempSumRate += rate;
sortOrignalRates.add(tempSumRate / sumRate);
}
// 根据区块值来获取抽取到的物品索引
double nextDouble = Math.random();
// 将随机值添加到序列并排序,通过indexOf来获取随机值所在的区间
sortOrignalRates.add(nextDouble);
Collections.sort(sortOrignalRates);
return sortOrignalRates.indexOf(nextDouble);
}
复制代码
Resumir
A ideia geral do algoritmo de loteria é organizar os prêmios em ordem. Obrigado por participar como prêmio. A ordem de disposição é irrelevante e, em seguida, aleatorize um número aleatório para ver em qual intervalo o número aleatório cai, ou seja , que prêmio. Para prêmios em estoque, o estoque pode ser calculado separadamente, caso o estoque se esgote, será devolvido diretamente. Obrigado por participar.