최근에 구정에 빨간 봉투와 인사를 보내는 것이 새로운 트렌드가되었습니다. 프로그래머로서 그는 빨간 봉투보다 알고리즘에 대해 훨씬 더 궁금합니다. 여기서 우리는 그가 생각한 무작위 레드 엔벨로프 할당 전략을 소개합니다. 조언을 해주세요.
알고리즘 소개
1. 빨간 봉투량 제한
Wechat Red Envelopes의 경우, 우리는 임의의 최소 레드 엔벨로프가 1 점이고 최대 금액은 200 위안이라는 것을 알고 있습니다. 여기서 우리는 또한 빨간 봉투 범위를 설정했습니다. 다음 코드는 돈 단위입니다.
// 최소 레드 엔벨로프 할당량 개인 정적 최종 최종 int minmoney = 1; // 최대 레드 엔벨로프 할당량 개인 정적 최종 최종 int maxmoney = 200 * 100;
2. 빨간 봉투의 양이 합법적인지 확인
이 단계에는 전체 알고리즘이 동반됩니다. 우리는 빨간 봉투를 할당하기 전에 금액이 합법적인지 판단 할 필요가있을뿐만 아니라 각 사람이 잠정적으로 임의의 금액을 설정 한 후 나머지 금액이 합법적인지 판단해야합니다.
개인 부울 isright (int money, int count) {double avg = money / count; if (avg <minmoney) {return false; } if (avg> maxmoney) {return false; } true를 반환합니다. } 3. 빨간 봉투를 무작위로 생성합니다
여기서 우리는 임의의 방법을 사용하여 Minmoney와 Maxmoney 사이에 빨간 봉투를 생성합니다. 빨간 봉투를 생성 한 후에는 나머지 돈이 합법적 인 빨간 봉투인지 여부를 결정해야합니다. 합법적 인 빨간 봉투가 아닌 경우 분배 계획을 다시 생성합니다. 분포 계획을 다시 생성 할 때 생성 된 빨간색 봉투가 너무 크든 작든지 결정해야합니다. 빨간 봉투가 너무 크면 다음에 우리는이 빨간 봉투 양의 빨간 봉투에 작은 값에 무작위로 도달하게됩니다. 빨간 봉투량이 너무 작 으면 빨간 봉투가 큰 값으로 빨간 봉투를 생성합니다.
private int random (int money, int mins, int maxs, int count) {// 빨간 봉투 수는 1이고 (count == 1) {return money; } // 최대 금액과 최소 금액이 같으면 (mins == maxs) {return mins; } int max = maxs> 돈? 돈 : 맥스; // 랜덤 엔벨로프 생성 int int one = ((int) math.rint (math.random () * (max -mins) + mins) % max + 1; int money1 = money- 하나; //이 할당 계획이 올바른지 (isright (money1, count -1)) {return one; } else {double avg = money1 / (count -1); if (avg <minmoney) {// 재귀 적으로 호출하고 최대 레드 엔벨로프 리턴 랜덤 (돈, 민, 1, count)의 최대량을 수정하십시오. } else if (avg> maxmoney) {// 재귀 적으로 호출하고, 빨간 봉투의 최소 금액을 랜덤 (돈, 1, maxs, count)을 수정합니다. }} 반환을 반환합니다. } 4. 빨간 봉투 할당을 실현하십시오
여기서, 많은 양의 자금을 차지하는 특정 빨간 봉투를 피하기 위해서는 일상적인 빨간 봉투의 최대량을 설정해야하며 평균 적색 봉투 금액의 N 배로 설정해야합니다. 1, 2 및 3의 방법으로, 우리는 빨간 봉투의 할당을 깨달을 수 있습니다.
// 각 빨간 봉투의 최대량은 평균 개인 정적 최종 이중 시간의 배수입니다 = 2.1; 공개 목록 <integer> slitedredpackets (int money, int count) {if (! isright (money, count)) {return null; } list <integer> list = new ArrayList <integer> (); // 빨간 봉투의 최대량은 평균 금액 int max = (int) (money * times /count)의 시간입니다. MAX = MAX> MAXMONEY? Maxmoney : Max; for (int i = 0; i <count; i ++) {int one = random (money, minmoney, max, count -i); list.add (1); 돈 -= 하나; } 반환 목록; }레드 봉투 할당 계획 평가
위의 내용은 빨간색 봉투의 기본 알고리즘을 소개합니다. 한 번에 알고리즘을 확인해 봅시다. 200 위안과 100 부의 빨간 봉투가 있다고 가정하십시오. 최종 할당 계획을 살펴 보겠습니다.
완전한 코드
/ ** *@description : */ package com.lulei.weixin.util; java.util.arraylist 가져 오기; Java.util.list 가져 오기; import com.lulei.util.jsonutil; 공개 클래스 redpacketutil {// 최소 레드 엔벨로프 할당량 개인 정적 최종 최종 Minmoney = 1; // 최대 레드 엔벨로프 할당량 개인 정적 최종 최종 int maxmoney = 200 * 100; // 각 빨간색 봉투의 최대 수는 평균 개인 정적 최종 이중 시간의 배수입니다 = 2.1; / ** * @param money * @param count * @return * @author : lulei * @description : 분할 빨간색 봉투 */ public list <integer> sliteredpackets (int money, int count) {if (! isright (money, count)) {return null; } list <integer> list = new ArrayList <integer> (); // 빨간 봉투의 최대량은 평균 금액 int max = (int) (money * times /count)의 시간입니다. MAX = MAX> MAXMONEY? Maxmoney : Max; for (int i = 0; i <count; i ++) {int one = random (money, minmoney, max, count -i); list.add (1); 돈 -= 하나; } 반환 목록; } /** * @param money * @param mins * @param maxs * @param count * @return * @author : lulei * @description : random redvelope limit * /private int random (int money, int mins, int maxs, int count) {// 빨간색 수평가는 1이고 그 금액은 직접 반환됩니다. } // 최대 금액과 최소 금액이 같으면 (mins == maxs) {return mins; } int max = maxs> 돈? 돈 : 맥스; // 랜덤 엔벨로프 생성 int int one = ((int) math.rint (math.random () * (max -mins) + mins) % max + 1; int money1 = money- 하나; //이 할당 계획이 올바른지 (isright (money1, count -1)) {return one; } else {double avg = money1 / (count -1); if (avg <minmoney) {// 재귀 적으로 호출하고 최대 레드 엔벨로프 리턴 랜덤 (돈, 민, 1, count)의 최대량을 수정하십시오. } else if (avg> maxmoney) {// 재귀 호출, 레드 엔벨로프의 최소 금액을 랜덤 랜덤 (Money, One, Maxs, Count)을 수정합니다. }} 반환을 반환합니다. } / ** * @param money * @param count * @return * @author : lulei * @description : 이런 종류의 빨간 봉투가 합법적입니까? * / private boolean isright (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 자동 생성 메소드 스터브 redpacketutil util = new redpacketutil (); System.out.println (jsonutil.parsejson (util.splitredpackets (20000, 100))); }}보다 흥미로운 콘텐츠를 보려면 "Android WeChat Development Tutorial Summary"및 "Java WeChat Development Tutorial Summary"를 클릭하십시오.
위의 내용은이 기사에 관한 모든 것입니다. 모든 사람들이 Java 프로그래밍을 배우는 것이 도움이되기를 바랍니다.