คำนำ
ตอนนี้แอพกำลังผุดขึ้นมาหลังจากฝนตกและกำลังทะยานออกมา มีประสบการณ์ไม่มีประสบการณ์มีคุณสมบัติและไม่มีเงื่อนไขทุกคนต้องการเริ่มต้นธุรกิจ ผู้ประกอบการมากกว่า 90% จำเป็นต้องสร้างแอพซึ่งดูเหมือนว่าจะกลายเป็นรูปแบบมาตรฐานสำหรับผู้ประกอบการ
เมื่อคุณสร้างแอพคุณต้องโปรโมต จะโปรโมตได้อย่างไร? การส่งคูปองเป็นสิ่งที่ขาดไม่ได้ที่สุด ตอนนี้ผลิตภัณฑ์หรือการดำเนินงานจำนวนมากต้องการจำนวนคูปองที่จะออกแบบสุ่ม แต่ไม่สามารถสุ่มเกินไป มีการส่งคูปองทั้งหมดหรือไม่? เงินของนักลงทุนใช่ไหม
ดังนั้นในจำนวนที่สร้างแบบสุ่มจำเป็นต้องมีความน่าจะเป็นของจำนวนเล็กน้อยที่ควรจะสูงขึ้นและความน่าจะเป็นของจำนวนมากควรจะเล็กลง ตัวอย่างเช่น 70% ของ 3 หยวน 25% ของ 5 หยวนและ 5% ของ 10 หยวน ฉันควรทำอย่างไรถ้าฉันสร้างคูปองด้วยความน่าจะเป็นแบบนี้?
สำหรับคำถามข้างต้นมันไม่เพียงพอที่จะใช้การสุ่มของเรา NEXT (ช่วงจำนวนเต็ม); โดยตรง. เนื่องจากการสุ่มหลอกนี้ไม่ถ่วงน้ำหนักความน่าจะเป็นของ 3, 5 และ 10 ที่ปรากฏเหมือนกัน
แนวคิดการใช้งาน
ลองมาตัวอย่างด้านบน ความน่าจะเป็นของ 3 ที่ปรากฏคือ 70% เรากำหนดน้ำหนัก 70 ความน่าจะเป็นของ 5 ที่ปรากฏคือ 25 เรากำหนดน้ำหนัก 25 ความน่าจะเป็นของ 10 ปรากฏคือ 5% เรากำหนดน้ำหนัก 5
เราคำนวณผลรวมของน้ำหนักตามลำดับใช้ค่าก่อนผลรวมของน้ำหนักที่ปรากฏในหมายเลขปัจจุบันเป็นค่าจุดเริ่มต้นของช่วงน้ำหนักและใช้ค่าหลังจากผลรวมเป็นค่าจุดสิ้นสุดของช่วงน้ำหนัก
ด้วยวิธีนี้เราสามารถใช้แบบสุ่ม NEXT (100) เพื่อสร้างตัวเลขแบบสุ่มจากนั้นตัดสินช่วงที่ตัวเลขสุ่มตกจากนั้นแมปกับค่าคูปองที่เกี่ยวข้อง
การใช้งาน Java
แพ็คเกจ com.nggirl.test.weight.random; นำเข้า java.util.arraylist; นำเข้า java.util.hashmap; นำเข้า java.util.list; นำเข้า java.util.random; การชั่งน้ำหนักระดับสาธารณะ String [] {"1", "2", "3", "4"}, จำนวนเต็มใหม่ [] {100,100,200,600}); สุ่ม r = new random (); สำหรับ (int i = 0; i <10; i ++) {Integer rv = r.nextint (wr.getMaxRandomValue ()); system.out.println (rv); system.out.println (wr.getElementByRandomValue (rv) .getKey () + "" + rv);} hashmap <สตริง 0); keycount.put ("2", 0); keycount.put ("3", 0); keycount.put ("4", 0); สำหรับ (int i = 0; i <10,000; wr.getElementByRandomValue (rv) .getKey (); keyCount.put (key, keycount.get (key) .intvalue ()+1);} system.out.println ("");} รายการส่วนตัว <น้ำหนัก> น้ำหนัก keys.length! = weights.length) {return;} ightelements = arraylist ใหม่ <eightelement> (); สำหรับ (int i = 0; i <keys.length; i ++) {heightElements.add (ightelement ใหม่ (keys [i], น้ำหนัก [i]); RangeWeightElemnts () {ถ้า (ightelements.size () == 0) {return;} ightelement ele0 = heightElements.get (0); ele0.SetthresholdLow (0); ele0.settholholdhigh (ele0.getweight (int i = 1; heightElements.get (i); preelement น้ำหนัก = ightelements.get (i - 1); curelement.setthresholdlow (preelement.getThresholdhigh ()); curelement.setthresholdhigh (curelement.getThresholdLow () ช่วงน้ำหนักขององค์ประกอบเพิ่มขึ้นในลักษณะที่เป็นระเบียบสามารถเปลี่ยนเป็นการค้นหาแบบไบนารี (heightElement E: ightelements) {ถ้า (rv> = e.getthresholdLow () && rv <e.getthresholdhigh ()) {return e;}} return null; 0) {return null;} return ightelements.get (ightelements.size () - 1) .getThresholdHigh ();} โมฆะสาธารณะ printrvs () {สำหรับ (heightElement e: ightelements) {system.out.println (e.toString (e.toString (e.toString (e.toString ( น้ำหนักจำนวนเต็ม;/*** น้ำหนักสอดคล้องกับช่วงของตัวเลขสุ่มบรรทัดต่ำ*/เกณฑ์จำนวนเต็มส่วนตัว;/*** น้ำหนักสอดคล้องกับช่วงของตัวเลขสุ่มเส้นสูง*/จำนวนเต็มส่วนตัว thresholdhigh; น้ำหนักสาธารณะ () {} น้ำหนักสาธารณะ น้ำหนัก) {this.key = key; this.weight = weight;} public String getkey () {return key;} public void setkey (คีย์สตริง) {this.key = key;} integer สาธารณะ getweight () {return weight;} public void setweight SetThresholdLow (จำนวนเต็ม thresholdLow) {this.thresholdLow = thresholdLow;} integer สาธารณะ getthresholdhigh () {return thresholdhigh;} โมฆะสาธารณะ setthresholdhigh (integer thresholdhigh) {this.thresholdhigh +this.weight+"ต่ำ:"+this.thresholdlow+"ความสูง:"+this.thresholdhigh;}}}}ผลลัพธ์:
2 1028764 876
การใช้งานการแบ่งขั้ว
น้ำหนักสาธารณะ GetElementByRandomValue (จำนวนเต็ม RV) {ถ้า (rv <0 || rv> getMaxRandomValue () -1) {return null;} // ในเวลานี้ RV จะต้องอยู่ในช่วง 0 -GetMaxRandomValue () -1 1; int index = ightelements.size ()/2; ในขณะที่ (จริง) {ถ้า (rv <ightelements.get (ดัชนี) .getThresholdLow ()) {end = ดัชนี - 1;} อื่นถ้า (rv> = heightElements.get (ดัชนี) สิ้นสุด)/2;}}มาแบ่งปันตัวอย่างอื่นด้านล่างเพื่อเสริมสร้างความเข้าใจของอัลกอริทึมแบบสุ่มน้ำหนักและอยู่ในสถานที่ในครั้งเดียว!
อัลกอริทึมแบบสุ่มน้ำหนักถูกนำมาใช้อย่างกว้างขวางในระบบเช่นลอตเตอรีการกำหนดเวลาทรัพยากร ฯลฯ เป็นการใช้งานแบบสุ่มอย่างง่ายตามน้ำหนัก น้ำหนักคืออัตราส่วนของการโจมตีของวัตถุสุ่มหลายรายการ (จัดหมวดหมู่) ยิ่งมีการตั้งค่าน้ำหนักมากเท่าใดการเข้าชมที่ง่ายขึ้นและผลรวมของการเข้าชมก็ไม่สามารถเท่ากับ 100;
รหัสการใช้งานอย่างง่ายมีดังนี้:
นำเข้า java.util.arraylist; นำเข้า java.util.list; นำเข้า java.util.random; การชั่งน้ำหนักระดับสาธารณะ {รายการคงที่ <HeightCategory> หมวดหมู่ = new ArrayList <WeightCategory> (); WeightCategory ("A", 60); WeightCategory WC2 = New WeightCategory ("B", 20); WeightCategory WC3 = New WeightCategory ("C", 20); categorys.add (WC1); categorys.add (wc2); categorys.adds (wc3); 0; สำหรับ (weightcategory wc: หมวดหมู่) {weightsum + = wc.getweight ();} ถ้า (weightsum <= 0) {system.err.println ("ข้อผิดพลาด: weightsum =" + weightsum.toString (); return; : หมวดหมู่) {ถ้า (m <= n && n <m +wc.getweight ()) {system.out.println ("หมวดหมู่สุ่มนี้คือ" +wc.getCategory ()); break;} m += wc.getweight (); หมวดหมู่น้ำหนักจำนวนเต็ม) {super (); this.setCategory (หมวดหมู่); this.setweight (น้ำหนัก);} public integer getweight () {น้ำหนักคืน;} โมฆะสาธารณะ setweight (น้ำหนักจำนวนเต็ม) {this.weight = weight;ผลลัพธ์:
สรุป
ข้างต้นเป็นเนื้อหาที่สมบูรณ์ของบทความนี้เกี่ยวกับการใช้อัลกอริทึมการสุ่มน้ำหนักภาษา Java ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!