Recientemente, enviar sobres rojos y saludos durante el Año Nuevo chino se ha convertido en una nueva tendencia. Como programador, tiene mucho más curiosidad por los algoritmos que sobre los sobres rojos. Aquí presentamos una estrategia de asignación de sobre rojo aleatorio que él pensó. Por favor dame algún consejo.
Algoritmo Introducción
1. Límite de cantidad de sobre del sobre rojo
Para los sobres rojos de WeChat, sabemos que ninguna envoltura roja mínima aleatoria es de 1 punto y la cantidad máxima es de 200 yuanes. Aquí también establecemos la gama de sobres rojos. El siguiente código es la unidad de dinero.
// cuota mínima de sobre rojo estática privada final int minmoney = 1; // Cuota de envoltura roja máxima estática privada final int maxMoney = 200 * 100;
2. Determine si la cantidad del sobre rojo es legal
Tenga en cuenta que este paso está acompañado por todo el algoritmo. No solo necesitamos juzgar si el monto es legal antes de asignar el sobre rojo, sino que también necesitamos juzgar si el monto restante es legal después de que cada persona establece tentativamente la cantidad aleatoria.
privado boolean isright (int dinero, int count) {doble avg = dinero / count; if (avg <minmoney) {return false; } if (avg> maxMoney) {return false; } return verdadero; } 3. Generar aleatoriamente un sobre rojo
Aquí utilizamos un método aleatorio para generar un sobre rojo entre MinMoney y MaxMoney. Después de generar el sobre rojo, debemos determinar si el dinero restante es un sobre rojo legal. Si no es un sobre rojo legal, volveremos a generar el plan de distribución. Al volver a generar el plan de distribución, debemos determinar si el sobre rojo generado es demasiado grande o demasiado pequeño. Si el sobre rojo es demasiado grande, la próxima vez alcanzaremos al azar un pequeño valor a un sobre rojo de esta cantidad de sobre rojo. Si la cantidad de envoltura roja es demasiado pequeña, generaremos un sobre rojo con una cantidad de sobre rojo a un valor grande.
private int aleator (int dinero, int mins, int maxs, int count) {// El número de sobres rojos es 1, y el monto se devuelve directamente si (count == 1) {return Money; } // Si la cantidad máxima y la cantidad mínima son iguales, la cantidad se devuelve directamente si (mins == maxs) {return mins; } int max = maxs> dinero? dinero: maxs; // Generar aleatorias un sobre rojo int uno = ((int) math.rint (math.random () * (max - mins) + mins)) % max + 1; int dinero1 = dinero - uno; // juzga si este plan de asignación es correcto si (isright (dinero1, count -1)) {return one; } else {double avg = money1 / (count - 1); if (avg <minmoney) {// llamar recursivamente, modifique la cantidad máxima de devolución de envoltura roja aleatoria (dinero, mins, uno, recuento); } else if (avg> maxMoney) {// llamar recursivamente, modificar la cantidad mínima de devolución de envoltura roja aleatoria (dinero, uno, maxs, count); }} devolver uno; } 4. Date la asignación de envases rojos
Aquí, para evitar que una cierta envoltura roja ocupe una gran cantidad de fondos, necesitamos establecer la cantidad máxima de la envoltura roja no perdida, y la establecemos en las veces la cantidad promedio de la envoltura roja; Con el método de uno, dos y tres, podemos darnos cuenta de la asignación de sobres rojos.
// La cantidad máxima de cada sobre rojo es un múltiplo de los tiempos finales finales privados promedio = 2.1; Lista pública <integer> SplitredPackets (int Money, int count) {if (! Isright (dinero, count)) {return null; } List <integer> list = new ArrayList <Integer> (); // La cantidad máxima del sobre rojo es tiempos de tiempo la cantidad promedio int max = (int) (dinero * Times /Count); max = max> maxMoney? MaxMoney: Max; para (int i = 0; i <count; i ++) {int uno = random (dinero, minmoney, max, count - i); list.add (uno); dinero -= uno; } Lista de retorno; }Evaluación del plan de asignación de sobre rojo
Lo anterior presenta el algoritmo básico para los sobres rojos. Verifiquemos el algoritmo a la vez. Supongamos que hay un sobre rojo de 200 yuanes y 100 copias. Echemos un vistazo al plan de asignación final.
Código completo
/ ** *@Descripción: */ paquete com.lulei.weixin.util; import java.util.arrayList; import java.util.list; import com.lulei.util.jsonutil; clase pública RedpacketUtil {// Cuota mínima de sobre rojo estático Final int minMoney = 1; // Cuota de envoltura roja máxima estática privada final int maxMoney = 200 * 100; // El número máximo de cada sobre rojo es un múltiplo de los tiempos finales finales privados promedio = 2.1; / ** * @param dinero * @param count * @return * @author: lulei * @Description: split rojo envolvente */ lista pública <integer> splitredpackets (int dinero, int count) {if (! Isright (dinero, count)) {return null; } List <integer> list = new ArrayList <Integer> (); // La cantidad máxima del sobre rojo es tiempos de tiempo la cantidad promedio int max = (int) (dinero * Times /Count); max = max> maxMoney? MaxMoney: Max; para (int i = 0; i <count; i ++) {int uno = random (dinero, minmoney, max, count - i); list.add (uno); dinero -= uno; } Lista de retorno; } /** * @param dinero * @param mins * @param maxs * @param count * @return * @author: lulei * @Description: limit de sobre rojo aleatorio * /private int aleation (int dinero, int mins, int maxs, int coDTIN } // Si la cantidad máxima y la cantidad mínima son iguales, la cantidad se devolverá directamente si (mins == maxs) {return mins; } int max = maxs> dinero? dinero: maxs; // Generar aleatorias un sobre rojo int uno = ((int) math.rint (math.random () * (max - mins) + mins)) % max + 1; int dinero1 = dinero - uno; // juzga si este plan de asignación es correcto si (isright (dinero1, count -1)) {return one; } else {double avg = money1 / (count - 1); if (avg <minmoney) {// llamar recursivamente, modifique la cantidad máxima de devolución de envoltura roja aleatoria (dinero, mins, uno, recuento); } else if (avg> maxMoney) {// llamada recursiva, modifique la cantidad mínima de devolución de envoltura roja al azar (dinero, uno, maxs, count); }} devolver uno; } / ** * @param dinero * @param count * @return * @author: lulei * @description: ¿es este tipo de sobre rojo legal? * / private boolean isright (int dinero, int count) {doble avg = dinero / count; if (avg <minmoney) {return false; } if (avg> maxMoney) {return false; } return verdadero; } public static void main (string [] args) {// TODO Método generado automático stub redpacketUtil util = new RedPacketUtil (); System.out.println (jsonutil.parsejson (util.splitredpackets (20000, 100))); }}Para obtener un contenido más emocionante, haga clic en "Resumen del tutorial de desarrollo de Android WeChat" y "Java WeChat Development Tutorial" Tutorial ", dan la bienvenida a todos para aprender y leer.
Lo anterior se trata de este artículo, espero que sea útil para todos aprender la programación de Java.