Recentemente, o envio de envelopes e saudações vermelhas durante o Ano Novo Chinês se tornou uma nova tendência. Como programador, ele está muito mais curioso sobre os algoritmos do que sobre envelopes vermelhos. Aqui, apresentamos uma estratégia aleatória de alocação de envelope vermelho que ele pensava. Por favor, me dê alguns conselhos.
Introdução ao algoritmo
1. Limite de quantidade do envelope vermelho
Para os envelopes vermelhos do WeChat, sabemos que nenhum envelope vermelho mínimo aleatório é de 1 ponto e a quantidade máxima é de 200 yuan. Aqui também definimos a gama de envelopes vermelhos. O código a seguir é a unidade de dinheiro.
// cota mínima de envelope vermelho private estático final int minmoney = 1; // Máximo da cota de envelope vermelho privado estático final int maxmoney = 200 * 100;
2. Determine se o valor do envelope vermelho é legal
Observe que esta etapa é acompanhada por todo o algoritmo. Não precisamos apenas julgar se o valor é legal antes de alocar o envelope vermelho, mas também precisar julgar se o valor restante é legal depois que cada pessoa define provisoriamente o valor aleatório.
private boolean isright (int dinheiro, int conting) {duplo avg = dinheiro / contagem; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } retornar true; } 3. Gerar aleatoriamente um envelope vermelho
Aqui, usamos um método aleatório para gerar um envelope vermelho entre Minmoney e Maxmoney. Depois de gerar o envelope vermelho, precisamos determinar se o dinheiro restante é um envelope vermelho legal. Se não for um envelope vermelho legal, re-generamos o plano de distribuição. Ao gerar novamente o plano de distribuição, precisamos determinar se o envelope vermelho gerado é muito grande ou muito pequeno. Se o envelope vermelho for muito grande, da próxima vez alcançaremos aleatoriamente um pequeno valor para um envelope vermelho dessa quantidade de envelope vermelho. Se o valor do envelope vermelho for muito pequeno, geraremos um envelope vermelho com um valor de envelope vermelho para um grande valor.
private int aleatória (int dinheiro, int mins, int maxs, int conting) {// O número de envelopes vermelhos é 1 e o valor é retornado diretamente se (count == 1) {retornar dinheiro; } // Se a quantidade máxima e a quantidade mínima forem iguais, a quantidade será retornada diretamente se (mins == maxs) {return mins; } int max = maxs> dinheiro? Dinheiro: Maxs; // gerar aleatório um envelope vermelho int one = ((int) math.rint (math.random () * (max - mins) + mins)) % max + 1; int Money1 = Money - um; // julga se esse plano de alocação está correto se (isright (Money1, contagem -1)) {return um; } else {Double avg = Money1 / (contagem - 1); if (avg <minmoney) {// ligue recursivamente, modifique a quantidade máxima de retorno do envelope vermelho aleatório (dinheiro, mins, um, contagem); } else if (avg> maxmoney) {// ligue recursivamente, modifique a quantidade mínima de retorno de envelope vermelho aleatório (dinheiro, um, maxs, contagem); }} retornar um; } 4. Realize a alocação de envelope vermelho
Aqui, para evitar um certo envelope vermelho ocupando uma grande quantidade de fundos, precisamos definir a quantidade máxima do envelope vermelho sem poucas lastes, e definimos para N vezes a quantidade média de envelope vermelho; Com o método de um, dois e três, podemos realizar a alocação de envelopes vermelhos.
// A quantidade máxima de cada envelope vermelho é um múltiplo do final estático médio estático duplo tempos = 2,1; Lista pública <Integer> SplitRedPackets (int Money, int conting) {if (! isright (dinheiro, contagem)) {return null; } Lista <Teger> list = new ArrayList <Teger> (); // O valor máximo do envelope vermelho é vezes o valor médio int max = (int) (dinheiro * vezes /contagem); max = max> maxmoney? MaxMoney: Max; for (int i = 0; i <contagem; i ++) {int one = aleatio (dinheiro, minmoney, max, count - i); list.add (um); dinheiro -= um; } Lista de retorno; }Avaliação do plano de alocação de envelope vermelho
O acima introduz o algoritmo básico para envelopes vermelhos. Vamos verificar o algoritmo ao mesmo tempo. Suponha que haja um envelope vermelho de 200 yuan e 100 cópias. Vamos dar uma olhada no plano de alocação final.
Código completo
/ ** *@Descrição: */ package com.lulei.weixin.util; importar java.util.arraylist; importar java.util.list; importação com.lulei.util.jsonutil; classe pública Redpacketutil {// Queira de envelope vermelha mínima private estático final int minmoney = 1; // Máximo da cota de envelope vermelho privado estático final int maxmoney = 200 * 100; // O número máximo de cada envelope vermelho é um múltiplo do final estático médio estático duplo times = 2,1; / ** * @param dinheiro * @param count * @return * @author: lulei * @description: split envelope */ list public <TEGER> splitRedPackets (int dinheiro, int contagem) {if (! isright (dinheiro, contagem)) {return null; } Lista <Teger> list = new ArrayList <Teger> (); // O valor máximo do envelope vermelho é vezes o valor médio int max = (int) (dinheiro * vezes /contagem); max = max> maxmoney? MaxMoney: Max; for (int i = 0; i <contagem; i ++) {int one = aleatio (dinheiro, minmoney, max, count - i); list.add (um); dinheiro -= um; } Lista de retorno; } /** * @param dinheiro * @param mins * @param maxs * @param count * @return * @author: lulei * @description: limite de envelope vermelho aleatório * /private int aleatória (int dinheiro, int mins, int maxs, int contagem) {// o número de envelopes vermelhos é 1 e a quantidade é direta } // Se a quantidade máxima e a quantidade mínima forem iguais, a quantidade será retornada diretamente se (mins == maxs) {return mins; } int max = maxs> dinheiro? Dinheiro: Maxs; // gerar aleatório um envelope vermelho int one = ((int) math.rint (math.random () * (max - mins) + mins)) % max + 1; int Money1 = Money - um; // julga se esse plano de alocação está correto se (isright (Money1, contagem -1)) {return um; } else {Double avg = Money1 / (contagem - 1); if (avg <minmoney) {// ligue recursivamente, modifique a quantidade máxima de retorno do envelope vermelho aleatório (dinheiro, mins, um, contagem); } else if (avg> maxmoney) {// chamada recursiva, modifique a quantidade mínima de retorno de envelope vermelho aleatório (dinheiro, um, maxs, contagem); }} retornar um; } / ** * @param dinheiro * @param count * @return * @author: lulei * @Description: Este tipo de envelope vermelho legal? * / private boolean isright (int dinheiro, int conting) {duplo avg = dinheiro / contagem; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } retornar true; } public static void main (string [] args) {// TODO Method Auto-Gerated Stub RedpacketUtil util = new Redpacketutil (); System.out.println (jsonutil.parsejson (util.splitredpackets (20000, 100))); }}Para um conteúdo mais emocionante, clique em "Resumo do tutorial de desenvolvimento do Android WeChat" e "Java WeChat Development Tutorial Resumo" Dê as boas -vindas a todos para aprender e ler.
O exposto acima é tudo sobre este artigo, espero que seja útil para todos aprenderem a programação Java.