이 예제는 참조에 대한 Java Lottery Rush 알고리즘을 공유합니다. 특정 내용은 다음과 같습니다
응용 프로그램 시나리오
싱글 피스 상 구매 (제한된 시간)
우연히 우승 한 여러 상 (제한된 시간, 제한 없음)
코드 구현
테이블 구조 :
-래프트 설정 생성 테이블 arc -Price ID 상태 번호 (5) 기본 0,-Status 0-Valid 1- vailable info_type 번호 (5) 기본값 0-0-normal); Alter Table Award_info 추가 제약 PK_AWARD_INFO 기본 키 (ID); -Winning Record Create Create Create Create Create Create Award (11), ACT_ID 번호 (11),-Act_ID 번호 (11), -Winning Time Product_ID 번호 (11), -Price ID 번호 (11) 기본 1,-우승 번호 Person varchar2 (50), --- 린너 Info_ID 번호 (11),-Raffle Setting ID Number (5); Award_Log 추가 제약 조건 PK_AWARD_LOG 기본 키 (ID);
암호:
공개 정적 계급 상 {public int ret; // 결과 결과 공개 int logid; // adrest_log id} /*** 러프 드로우 드로우 알고리즘* @param actid luck draw activity id* @param person luck draw person* @param productid prize id -1은 활동 id* @param excludeid privude prize id -1이 배제되지 않았으며, productid와 동시에 @param 검사를 할 수 없는지 여부를 확인할 수 없습니다. -2 상이 그려졌다. -3 기타 오류; > = 0 우승 곱지; -4 ID 제외 * @Throws Exception */ public static arvertult getawardfull (int actid, string person, int productId, int [] excludeIds, boolean checkdate) sqlexception {AwardResult result = new AwardResult (); Connection conn = jdbc.getConnection (); conn.setAutocommit (false); try {list <map <string, object >> 행; 문자열 SQL; 문자열 checkDatest = ""; String BaseSql = "select t.id, t.product_id, t.num, t.rest, t.odds, t.info_type where t.act_id =? 및 t.state = 0"; if (checkDate) {checkDatest = "및 t.start_date <= sysdate 및 t.end_date> = sysdate"; } if (productId> 0) {// snap sql = baseSql + "및 t.product_id =?" + checkdatestr + "업데이트 용"; 행 = jdbc.getrows (sql, new Object [] {actid, productId}, conn); } else {// 활동에 대한 모든 항목이 SQL = BaseSQL + checkDatest + "업데이트"; 행 = jdbc.getrows (sql, new Object [] {actid}, conn); } if (rows.isempty ()) {// draw data log.info (no draw data actid = {} person = {} productId = {} excludeIds = {} checkdate = {} ", person, productId, excludeDs, checkdate); conn.commit (); result.ret = -1; 반환 결과; } int Infoid = -1; int getProductId = -1; int num = -1; int rest = -1; if (rows.size () == 1) {// snap num = ((number) rows.get (0) .get ( "num")). intvalue (); rest = ((번호) rows.get (0) .get ( "rest")). intvalue (); infoid = ((숫자) rows.get (0) .get ( "id")). intvalue (); getProductId = ((번호) rows.get (0) .get ( "product_id")). intvalue (); } else {// rull draw int [] [] temp = new int [rows.size ()] [3]; int sum = -1; int i = 0; for (int k = 0; k <rows.size (); k ++) {// 상금 풀 int ondds = ((bigdecimal) rows.get (k) .get ( "woodds")). intvalue (); 합계 ++; 온도 [i] [0] = 합; // 시작 값 sum = sum + ondds; 온도 [i] [1] = 합; // 엔드 값 온도 [i] [2] = k; // 행 색인 I ++; } // Roll Draw Random Random = New Random (); int r = random.nextInt (sum + 1); int j = 0; for (int k = 0; k <i; k ++) {if (r> = temp [k] [0] && r <= temp [k] [1]) {j = k; 부서지다; }} infoid = ((bigdecimal) rows.get (temp [j] [2]). get ( "id")). intvalue (); getProductId = ((bigdecimal) rows.get (temp [j] [2]). get ( "product_id")). intvalue (); num = ((숫자) rows.get (temp [j] [2]). get ( "num")). intvalue (); rest = ((번호) rows.get (temp [j] [2]). get ( "rest")). intvalue (); } // if (arrayutils.crantains (excludeIds, getProductId)) {log.info ( "excedud id actid = {} person = {upledtId = {} excludeDs = {} checkDate = {}", actid, person, productId, excludeDs, checkdate); conn.commit (); result.ret = -4; 반환 결과; } // if (num> 0 && rest <= 0) {log.info ( "상은 accid = {} person = {} productId = {} excludeIds = {} checkDate = {}", ActID, Person, ProductID, ExcludeIds, CheckDate); jdbc.commit (conn); result.ret = -2; 반환 결과; } // 상금 레코드를 업데이트하면 (num> 0) {// 무제한 sql = "update arvere_info set rest = rest -1 where id =?"; jdbc.update (sql, new Object [] {infoid}, conn); } // 우승자 목록을 기록한 수상자 로그 = New AwardLog (); log.setActID (ActID); log.setnum (1); log.setperson (사람); log.setProductId (getProductId); log.setinfoid (Infoid); 번호 logid = log.save (conn); if (logid == null) {새 sqlexception을 던지십시오 ( "Save Award_Log Error"); } result.logid = logid.intValue (); conn.commit (); result.ret = getProductId; 반환 결과; } catch (sqlexception e) {log.error ( "getaward error", e); conn.rollback (); } 마침내 {jdbc.close (conn); } result.ret = -3; 반환 결과; }위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.