Недавно отправка красных конвертов и приветствий в китайский Новый год стала новой тенденцией. Как программист, он гораздо более любопытен в отношении алгоритмов, чем о красных конвертах. Здесь мы представляем случайную стратегию распределения красной конверты, о которой он думал. Пожалуйста, дайте мне несколько советов.
Алгоритм введение
1. Ограничение суммы красного конверта
Для weChat красных конвертов мы знаем, что ни одна случайная минимальная красная конверт не является 1 точкой, а максимальное количество составляет 200 юаней. Здесь мы также устанавливаем диапазон красных конвертов. Следующий код - это единица денег.
// минимальная квота красного конверта частная статическая финала int minmoney = 1; // Квота с максимальной красной конвертом Частный статический финал int maxmoney = 200 * 100;
2. Определите, является ли сумма красного конверта законной
Обратите внимание, что этот шаг сопровождается всем алгоритмом. Нам нужно не только судить о том, является ли сумма законной, прежде чем выделить красный конверт, но также нужно судить, является ли оставшаяся сумма законной после того, как каждое лицо предварительно устанавливает случайную сумму.
Private Boolean ISright (int money, int count) {double avg = деньги / count; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } вернуть true; } 3. Случайно генерируйте красную конверт
Здесь мы используем случайный метод для создания красной конверты между Минмони и Максмони. После создания красного конверта нам необходимо определить, являются ли оставшиеся деньги законным красным конвертом. Если это не легальный красный конверт, мы переоценим план распространения. При повторном генерировании плана распределения нам нужно определить, является ли сгенерированная красная конверт слишком большой или слишком мал. Если красный конверт слишком большой, в следующий раз мы случайным образом достигнем небольшого значения до красной конверты этой суммы красной огибающей. Если сумма красной конверты слишком мала, мы создадим красную конверт с красной огибающей суммой до большого значения.
private int random (int money, int mins, int maxs, int count) {// количество красных конвертов составляет 1, а сумма возвращается напрямую, если (count == 1) {return money; } // Если максимальная сумма и минимальная сумма равны, сумма возвращается напрямую, если (mins == maxs) {return mins; } int max = maxs> деньги? Деньги: Макс; // Случайное генерирование красной оболочки int one = ((int) math.rint (math.random () * (max - mins) + mins)) % max + 1; int money1 = деньги - один; // судить, является ли этот план распределения правильным, если (isright (money1, count -1)) {вернуть один; } else {double avg = money1 / (count - 1); if (avg <minmoney) {// рекурсивно вызовите, измените максимальную сумму Red Overvelope return Range (деньги, мин, один, счет); } else if (avg> maxmoney) {// рекурсивно вызовать, изменить минимальную сумму Red Overvelope return Random (Money, One, maxs, count); }} вернуть один; } 4. Реализуйте распределение красного конверта
Здесь, чтобы избежать определенной красной конверты, занимающей большую сумму средств, нам необходимо установить максимальное количество некачественного красного конверта, и мы устанавливаем его на n раз средней суммы красной конверты; С помощью метода одного, двух и трех мы можем реализовать распределение красных конвертов.
// максимальное количество каждого красного огибала - это кратно средняя частная статическая статическая окончательная окончательная двойная раза = 2,1; Общедоступный список <Integer> splitredpackets (int money, int count) {if (! isright (money, count)) {return null; } List <Integer> list = new ArrayList <Integer> (); // максимальная сумма красной огибающей в период времени превышает среднюю сумму int max = (int) (деньги * время /count); max = max> maxmoney? Максмони: Макс; for (int i = 0; i <count; i ++) {int one = случайный (деньги, minmoney, max, count - i); list.add (один); Деньги -= один; } return List; }Оценка плана распределения красной конверты
Вышеуказанное представляет базовый алгоритм для красных конвертов. Давайте проверим алгоритм одновременно. Предположим, есть красная конверт 200 юаней и 100 экземпляров. Давайте посмотрим на окончательный план распределения.
Полный код
/ ** *@Описание: */ package com.lulei.weixin.util; импортировать java.util.arraylist; импортировать java.util.list; импорт com.lulei.util.jsonutil; открытый класс RedPacketUtil {// Минимальная квота красно -конверта частная статическая финала int minmoney = 1; // Квота с максимальной красной конвертом Частный статический финал int maxmoney = 200 * 100; // Максимальное количество каждого красного конверта - это кратное среднее частное статическое окончательное двойное двойное время = 2,1; / ** * @param money * @param count * @return * @author: lulei * @description: split red evvelope */ public <Integer> splitredpackets (int money, int count) {if (! ISright (Money, count)) {return null; } List <Integer> list = new ArrayList <Integer> (); // максимальная сумма красной огибающей в период времени превышает среднюю сумму int max = (int) (деньги * время /count); max = max> maxmoney? Максмони: Макс; for (int i = 0; i <count; i ++) {int one = случайный (деньги, minmoney, max, count - i); list.add (один); Деньги -= один; } return List; } /** * @param money * @param minS * @param maxS * @param count * @return * @Author:lulei * @Description: Random red envelope limit*/ private int random(int money, int minS, int maxS, int count) { //The number of red envelopes is 1, and the amount is directly returned if (count == 1) { return money; } // Если максимальная сумма и минимальная сумма равны, сумма будет возвращена напрямую, если (mins == maxs) {return mins; } int max = maxs> деньги? Деньги: Макс; // Случайное генерирование красной оболочки int one = ((int) math.rint (math.random () * (max - mins) + mins)) % max + 1; int money1 = деньги - один; // судить, является ли этот план распределения правильным, если (isright (money1, count -1)) {вернуть один; } else {double avg = money1 / (count - 1); if (avg <minmoney) {// рекурсивно вызовите, измените максимальную сумму Red Overvelope return Range (деньги, мин, один, счет); } else if (avg> maxmoney) {// рекурсивный вызов, изменить минимальную сумму Red Overvelope return Random (Money, One, maxs, count); }} вернуть один; } / ** * @param money * @param count * @return * @author: lulei * @description: этот вид красного конверта законен? * / private boolean isry (int money, int count) {double avg = money / count; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } вернуть true; } public static void main (string [] args) {// todo Автопогенерированный метод stub redpacketutil util = new Redpacketutil (); System.out.println (jsonutil.parsejson (util.splitredpackets (20000, 100))); }}Для получения более захватывающего контента, пожалуйста, нажмите «Резюме для разработки Android WeChat» и «Резюме по разработке Java WeChat» Добро пожаловать, чтобы все учились и прочитали.
Выше приведено все об этой статье, я надеюсь, что для всех будет полезно изучать программирование Java.