本文实例为大家分享了 Java 随机数生成代码, 供大家参考, 具体内容如下
แพ็คเกจ com.gonvan.common.utils; นำเข้า Java.util.*; /** * 随机数工具 * * @author yuerzm * * /ลอตเตอรีอเลียลอสเมทอดระดับสุดท้ายสาธารณะ { /** * ตัวสร้างตัวเลขสุ่มที่ใช้ตัวอย่างจากการแจกแจง */ การสุ่มสุ่มครั้งสุดท้ายส่วนตัว; /*** ตารางนามแฝง */ ส่วนตัว int สุดท้าย [] นามแฝง; /*** ตารางความน่าจะเป็น */ ส่วนตัวสองครั้งสุดท้าย [] ความน่าจะเป็น; /** * สร้าง aliasmethod ใหม่เพื่อสุ่มตัวอย่างจากการแจกแจงแบบไม่ต่อเนื่องและ * ส่งกลับผลลัพธ์กลับตามการแจกแจงความน่าจะเป็น * <p/> * ให้เป็นรายการความน่าจะเป็นที่สอดคล้องกับผลลัพธ์ 0, 1, * ... , n - 1, คอนสตรัคเตอร์นี้สร้างความน่าจะเป็นและตารางนามแฝง * ที่จำเป็นในการสุ่มตัวอย่างอย่างมีประสิทธิภาพจากการแจกแจงนี้ * * ความน่าจะเป็น @param * รายการความน่าจะเป็น */ Public LotteryaliasMethod (รายการ <bould> ความน่าจะเป็น) {สิ่งนี้ (ความน่าจะเป็น, ใหม่สุ่ม ()); } /** * สร้าง aliasmethod ใหม่เพื่อสุ่มตัวอย่างจากการแจกแจงแบบไม่ต่อเนื่องและ * ผลลัพธ์กลับมาตามการแจกแจงความน่าจะเป็น * <p/> * ให้เป็นรายการความน่าจะเป็นที่สอดคล้องกับผลลัพธ์ 0, 1, * ... , n - 1 พร้อมกับเครื่องกำเนิดตัวเลขสุ่มที่ควรใช้เป็น * เครื่องกำเนิดพื้นฐานตัวสร้างนี้สร้างความน่าจะเป็นและตารางนามแฝง * * ความน่าจะเป็น @param * รายการความน่าจะเป็น * @Param Random * ตัวสร้างตัวเลขสุ่ม * / Public LotteryaliAsMethod (รายการ <bouble> ความน่าจะเป็นสุ่มสุ่ม) { / * เริ่มต้นด้วยการตรวจสอบโครงสร้างพื้นฐานเกี่ยวกับอินพุต */ if (ความน่าจะเป็น == null || สุ่ม == null) โยน nullpointerexception ใหม่ (); ถ้า (ความน่าจะเป็น. size () == 0) โยน unlegalargumentException ใหม่ ("เวกเตอร์ความน่าจะเป็นจะต้องไม่ว่างเปล่า"); /* จัดสรรพื้นที่สำหรับตารางความน่าจะเป็นและนามแฝง */ ความน่าจะเป็น = ใหม่สองเท่า [ความน่าจะเป็น. size ()]; นามแฝง = int ใหม่ [ความน่าจะเป็น. size ()]; /* เก็บเครื่องกำเนิดไฟฟ้าพื้นฐาน */ this.random = สุ่ม; /* คำนวณความน่าจะเป็นโดยเฉลี่ยและแคชสำหรับการใช้งานในภายหลัง * / ค่าเฉลี่ยสองครั้งสุดท้าย = 1.0 / ความน่าจะเป็น. size (); / * * สร้างสำเนาของรายการความน่าจะเป็นเนื่องจากเราจะทำการเปลี่ยนแปลง * */ ความน่าจะเป็น = new ArrayList <bould> (ความน่าจะเป็น); /* สร้างสองสแต็คเพื่อทำหน้าที่เป็นรายการงานในขณะที่เราเติมตาราง */ deque <จำนวนเต็ม> small = new ArrayDeque <Integer> (); deque <teeger> large = new ArrayDeque <Integer> (); /* เติมสแต็คด้วยความน่าจะเป็นอินพุต * / สำหรับ (int i = 0; i <probabilities.size (); ++ i) { / * * หากความน่าจะเป็นต่ำกว่าความน่าจะเป็นโดยเฉลี่ยแล้วเราจะเพิ่ม * ลงในรายการเล็ก ๆ มิฉะนั้นเราจะเพิ่มลงในรายการขนาดใหญ่ */ ถ้า (ความน่าจะเป็น. get (i)> = ค่าเฉลี่ย) large.add (i); else small.add (i); } / * * เป็นหมายเหตุ: ในข้อกำหนดทางคณิตศาสตร์ของอัลกอริทึมเรา * จะหมดรายการเล็ก ๆ ก่อนรายการใหญ่ อย่างไรก็ตาม * เนื่องจากความไม่ถูกต้องของจุดลอยตัวสิ่งนี้ไม่จำเป็นต้องเป็นจริง * ดังนั้นวงในนี้ (ซึ่งพยายามจับคู่องค์ประกอบขนาดเล็กและขนาดใหญ่ *) จะต้องตรวจสอบว่าทั้งสองรายการไม่ว่างเปล่า * / ในขณะที่ (! small.isempty () &&! large.isempty ()) { /* รับดัชนีของความน่าจะเป็นขนาดเล็กและขนาดใหญ่ */ int less = small.remoVelast (); int more = ใหญ่ removelast (); / * * ความน่าจะเป็นเหล่านี้ยังไม่ได้รับการปรับขนาดให้เป็นเช่นนั้น * 1/n ได้รับน้ำหนัก 1.0 เราทำสิ่งนี้ที่นี่แทน */ ความน่าจะเป็น [น้อยลง] = ความน่าจะเป็น. get (น้อยกว่า) * ความน่าจะเป็น. size (); นามแฝง [น้อยลง] = มากขึ้น; / * * ลดความน่าจะเป็นของจำนวนที่ใหญ่กว่าด้วยจำนวน * ที่เหมาะสม */ ความน่าจะเป็น. set (เพิ่มเติม (ความน่าจะเป็น. get (เพิ่มเติม) + ความน่าจะเป็น get (น้อยกว่า)) - เฉลี่ย); / * * หากความน่าจะเป็นใหม่น้อยกว่าค่าเฉลี่ยให้เพิ่มลงในรายการขนาดเล็ก *; มิฉะนั้นเพิ่มลงในรายการขนาดใหญ่ * / ถ้า (ความน่าจะเป็น (เพิ่มเติม)> = 1.0 / ความน่าจะเป็น. size ()) large.add (เพิ่มเติม); else small.add (เพิ่มเติม); } / * * ณ จุดนี้ทุกอย่างอยู่ในรายการเดียวซึ่งหมายความว่าความน่าจะเป็น * ที่เหลืออยู่ควรเป็น 1 /n ขึ้นอยู่กับสิ่งนี้ให้ตั้งค่า * อย่างเหมาะสม เนื่องจากปัญหาเชิงตัวเลขเราไม่สามารถแน่ใจได้ว่า * สแต็กใดจะเก็บรายการไว้ดังนั้นเราจึงว่างเปล่าทั้งคู่ */ ในขณะที่ (! small.isempty ()) ความน่าจะเป็น [small.removelast ()] = 1.0; ในขณะที่ (ขนาดใหญ่ isempty ()) ความน่าจะเป็น [large.Removelast ()] = 1.0; } /*** ตัวอย่างค่าจากการแจกแจงพื้นฐาน * * @return ค่าสุ่มสุ่มตัวอย่างจากการแจกแจงพื้นฐาน * / public int next () { /* สร้างม้วนตายอย่างยุติธรรมเพื่อกำหนดคอลัมน์ที่จะตรวจสอบ */ int column = random.nextint (ความน่าจะเป็นความยาว); /* สร้างการโยนเหรียญลำเอียงเพื่อพิจารณาว่าจะเลือกตัวเลือกใด */ boolean cointoss = random.nextdouble () <ความน่าจะเป็น [คอลัมน์]; /* ขึ้นอยู่กับผลลัพธ์ให้ส่งคืนคอลัมน์หรือนามแฝง */ ส่งคืน COINTOSS? คอลัมน์: นามแฝง [คอลัมน์]; -以上就是本文的全部内容, 希望对大家的学习有所帮助。