เมื่อเร็ว ๆ นี้การส่งซองจดหมายสีแดงและคำทักทายในช่วงปีใหม่ของจีนได้กลายเป็นเทรนด์ใหม่ ในฐานะโปรแกรมเมอร์เขามีความอยากรู้อยากเห็นเกี่ยวกับอัลกอริทึมมากกว่าเกี่ยวกับซองจดหมายสีแดง ที่นี่เราแนะนำกลยุทธ์การจัดสรรซองจดหมายสีแดงแบบสุ่มที่เขาคิด กรุณาให้คำแนะนำฉัน
อัลกอริทึมบทนำ
1. ขีด จำกัด จำนวนซองจดหมายสีแดง
สำหรับซองจดหมายสีแดง WeChat เรารู้ว่าไม่มีซองจดหมายสีแดงขั้นต่ำแบบสุ่มคือ 1 จุดและจำนวนสูงสุดคือ 200 หยวน ที่นี่เรายังกำหนดช่วงของซองจดหมายสีแดง รหัสต่อไปนี้เป็นหน่วยของเงิน
// โควต้าซองจดหมายสีแดงขั้นต่ำส่วนตัวคงสุดท้าย int minmoney = 1; // สูงสุดซองจดหมายโควต้าส่วนตัวคงที่สุดท้าย int maxMoney = 200 * 100;
2. ตรวจสอบว่าปริมาณของซองจดหมายสีแดงนั้นถูกกฎหมายหรือไม่
โปรดทราบว่าขั้นตอนนี้มาพร้อมกับอัลกอริทึมทั้งหมด เราไม่เพียง แต่จำเป็นต้องตัดสินว่าจำนวนเงินนั้นถูกกฎหมายก่อนที่จะจัดสรรซองจดหมายสีแดง แต่ยังต้องตัดสินว่าจำนวนเงินที่เหลืออยู่นั้นถูกกฎหมายหรือไม่หลังจากแต่ละคนตั้งค่าจำนวนสุ่มอย่างไม่แน่นอน
บูลีนส่วนตัว isright (int money จำนวน int) {double avg = money / count; if (avg <minmoney) {return false; } if (avg> maxMoney) {return false; } return true; - 3. สุ่มสร้างซองจดหมายสีแดง
ที่นี่เราใช้วิธีการสุ่มเพื่อสร้างซองจดหมายสีแดงระหว่าง MinMoney และ MaxMoney หลังจากสร้างซองจดหมายสีแดงเราต้องพิจารณาว่าเงินที่เหลือเป็นซองจดหมายสีแดงตามกฎหมายหรือไม่ หากไม่ใช่ซองจดหมายสีแดงตามกฎหมายเราจะจัดทำแผนการจัดจำหน่ายใหม่อีกครั้ง เมื่อสร้างแผนการจัดจำหน่ายใหม่เราจำเป็นต้องพิจารณาว่าซองจดหมายสีแดงที่สร้างขึ้นนั้นมีขนาดใหญ่เกินไปหรือเล็กเกินไป หากซองจดหมายสีแดงมีขนาดใหญ่เกินไปในครั้งต่อไปเราจะสุ่มให้ค่าเล็กน้อยกับซองจดหมายสีแดงของจำนวนซองจดหมายสีแดงนี้ หากปริมาณซองจดหมายสีแดงมีขนาดเล็กเกินไปเราจะสร้างซองจดหมายสีแดงที่มีซองจดหมายสีแดงเป็นจำนวนมาก
การสุ่ม int ส่วนตัว (เงิน int, int mins, int maxs, จำนวน int) {// จำนวนซองจดหมายสีแดงคือ 1 และจำนวนเงินจะถูกส่งคืนโดยตรงถ้า (count == 1) {คืนเงิน; } // หากจำนวนเงินสูงสุดและจำนวนเงินต่ำสุดเท่ากันจำนวนเงินจะถูกส่งคืนโดยตรงถ้า (mins == maxs) {return mins; } int max = maxs> เงิน? เงิน: แม็กซ์; // สุ่มสร้างซองจดหมายสีแดง int one = ((int) math.rint (math.random () * (สูงสุด - นาที) + นาที)) % สูงสุด + 1; int money1 = เงิน - หนึ่ง; // ตัดสินว่าแผนการจัดสรรนี้ถูกต้องหรือไม่ถ้า (isright (money1, count -1)) {return one; } else {double avg = money1 / (count - 1); if (avg <minmoney) {// เรียกซ้ำแล้วซ้ำอีกแก้ไขจำนวนสูงสุดของซองจดหมายสีแดงส่งคืนแบบสุ่ม (เงิน, นาที, หนึ่ง, นับ); } อื่นถ้า (avg> maxMoney) {// โทรซ้ำ, แก้ไขจำนวนขั้นต่ำของซองจดหมายสีแดงส่งคืนแบบสุ่ม (เงิน, หนึ่ง, maxs, นับ); }} ส่งคืนหนึ่ง; - 4. ตระหนักถึงการจัดสรรซองจดหมายสีแดง
ที่นี่เพื่อหลีกเลี่ยงซองจดหมายสีแดงบางแห่งที่ครอบครองเงินจำนวนมากเราจำเป็นต้องตั้งค่าซองจดหมายสีแดงที่ไม่ได้มีค่าสูงสุดและเราตั้งค่าเป็นจำนวนซองจดหมายสีแดงโดยเฉลี่ย ด้วยวิธีการของหนึ่งสองและสามเราสามารถตระหนักถึงการจัดสรรซองจดหมายสีแดง
// จำนวนสูงสุดของซองจดหมายสีแดงแต่ละอันคือการหลายครั้งสุดท้ายของเอกชนคงที่สองเท่าสุดท้าย = 2.1; รายการสาธารณะ <จำนวนเต็ม> SplitredPackets (int money, int count) {ถ้า (! isright (money, count)) {return null; } list <integer> list = new ArrayList <integer> (); // จำนวนสูงสุดของซองจดหมายสีแดงเป็นครั้งที่จำนวนเงินเฉลี่ยสูงสุด int max = (int) (เงิน * คูณ /นับ); สูงสุด = สูงสุด> MaxMoney? MaxMoney: Max; สำหรับ (int i = 0; i <count; i ++) {int one = random (เงิน, minmoney, max, count - i); list.add (หนึ่ง); เงิน -= หนึ่ง; } return list; -การประเมินแผนการจัดสรรซองจดหมายสีแดง
ข้างต้นแนะนำอัลกอริทึมพื้นฐานสำหรับซองจดหมายสีแดง มาตรวจสอบอัลกอริทึมในครั้งเดียว สมมติว่ามีซองจดหมายสีแดง 200 หยวนและ 100 สำเนา มาดูแผนการจัดสรรสุดท้าย
กรอกรหัส
/ ** *@คำอธิบาย: */ แพ็คเกจ 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: แยกซองจดหมายสีแดง */ รายการสาธารณะ <จำนวนเต็ม> splitredpackets (int money จำนวน int) {ถ้า (! is is (is is is (is is is is is ( } list <integer> list = new ArrayList <integer> (); // จำนวนสูงสุดของซองจดหมายสีแดงเป็นครั้งที่จำนวนเงินเฉลี่ยสูงสุด int max = (int) (เงิน * คูณ /นับ); สูงสุด = สูงสุด> MaxMoney? MaxMoney: Max; สำหรับ (int i = 0; i <count; i ++) {int one = random (เงิน, minmoney, max, count - i); list.add (หนึ่ง); เงิน -= หนึ่ง; } return list; } /** * @param money * @param mins * @param maxs * @param count * @return * @author: lulei * @description: การสุ่มซองจดหมายสีแดง * /การสุ่ม int ส่วนตัว } // หากจำนวนเงินสูงสุดและจำนวนเงินต่ำสุดเท่ากันจำนวนเงินจะถูกส่งคืนโดยตรงถ้า (mins == maxs) {return mins; } int max = maxs> เงิน? เงิน: แม็กซ์; // สุ่มสร้างซองจดหมายสีแดง int one = ((int) math.rint (math.random () * (สูงสุด - นาที) + นาที)) % สูงสุด + 1; int money1 = เงิน - หนึ่ง; // ตัดสินว่าแผนการจัดสรรนี้ถูกต้องหรือไม่ถ้า (isright (money1, count -1)) {return one; } else {double avg = money1 / (count - 1); if (avg <minmoney) {// เรียกซ้ำแล้วซ้ำอีกแก้ไขจำนวนสูงสุดของซองจดหมายสีแดงส่งคืนแบบสุ่ม (เงิน, นาที, หนึ่ง, นับ); } อื่นถ้า (avg> maxMoney) {// การโทรแบบเรียกซ้ำ, แก้ไขจำนวนขั้นต่ำของซองจดหมายสีแดงส่งคืนแบบสุ่ม (เงิน, หนึ่ง, maxs, นับ); }} ส่งคืนหนึ่ง; } / ** * @param Money * @param Count * @return * @author: lulei * @description: ซองจดหมายสีแดงชนิดนี้ถูกกฎหมายหรือไม่ * / บูลีนส่วนตัว (เงิน int, จำนวน int) {double avg = money / count; if (avg <minmoney) {return false; } if (avg> maxMoney) {return false; } return true; } โมฆะคงที่สาธารณะหลัก (String [] args) {// วิธีการที่สร้างขึ้นอัตโนมัติ todo stub redpacketutil util = new redpacketUtil (); System.out.println (jsonutil.parsejson (util.splitredPackets (20000, 100))); -สำหรับเนื้อหาที่น่าตื่นเต้นมากขึ้นโปรดคลิก "สรุปการสอนการพัฒนา Android WeChat" และ "สรุปการสอนการพัฒนา Java WeChat" ยินดีต้อนรับทุกคนที่จะเรียนรู้และอ่าน
ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์สำหรับทุกคนในการเรียนรู้การเขียนโปรแกรม Java