Sorteio da Roda Grande

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.

Acho que você gosta

Origin juejin.im/post/7087015478115172388
Recomendado
Clasificación