ฉันสร้างคลาสQuickRandomขึ้นมาและงานของมันคือการสร้างตัวเลขสุ่มอย่างรวดเร็ว มันง่ายมาก: แค่เอาค่าเก่ามาคูณด้วย a doubleและหาส่วนทศนิยม
นี่คือQuickRandomชั้นเรียนของฉันทั้งหมด:
public class QuickRandom {
    private double prevNum;
    private double magicNumber;
    public QuickRandom(double seed1, double seed2) {
        if (seed1 >= 1 || seed1 < 0) throw new IllegalArgumentException("Seed 1 must be >= 0 and < 1, not " + seed1);
        prevNum = seed1;
        if (seed2 <= 1 || seed2 > 10) throw new IllegalArgumentException("Seed 2 must be > 1 and <= 10, not " + seed2);
        magicNumber = seed2;
    }
    public QuickRandom() {
        this(Math.random(), Math.random() * 10);
    }
    public double random() {
        return prevNum = (prevNum*magicNumber)%1;
    }
}
และนี่คือรหัสที่ฉันเขียนขึ้นเพื่อทดสอบ:
public static void main(String[] args) {
        QuickRandom qr = new QuickRandom();
        /*for (int i = 0; i < 20; i ++) {
            System.out.println(qr.random());
        }*/
        //Warm up
        for (int i = 0; i < 10000000; i ++) {
            Math.random();
            qr.random();
            System.nanoTime();
        }
        long oldTime;
        oldTime = System.nanoTime();
        for (int i = 0; i < 100000000; i ++) {
            Math.random();
        }
        System.out.println(System.nanoTime() - oldTime);
        oldTime = System.nanoTime();
        for (int i = 0; i < 100000000; i ++) {
            qr.random();
        }
        System.out.println(System.nanoTime() - oldTime);
}
มันเป็นอัลกอริธึมที่ง่ายมากที่จะเพิ่มทวีคูณคู่ก่อนหน้าด้วย double number "double" ฉันเหวี่ยงมันเร็วเข้าด้วยกันดังนั้นฉันน่าจะทำได้ดีกว่า แต่ก็ดูเหมือนว่ามันจะทำงานได้ดี
นี่คือตัวอย่างเอาต์พุตของบรรทัดที่ถูกคอมเม้นต์ในmainวิธีการ:
0.612201846732229
0.5823974655091941
0.31062451498865684
0.8324473610354004
0.5907187526770246
0.38650264675748947
0.5243464344127049
0.7812828761272188
0.12417247811074805
0.1322738256858378
0.20614642573072284
0.8797579436677381
0.022122999476108518
0.2017298328387873
0.8394849894162446
0.6548917685640614
0.971667953190428
0.8602096647696964
0.8438709031160894
0.694884972852229
ฮึ่ม ค่อนข้างสุ่ม ในความเป็นจริงแล้วมันจะทำงานกับตัวสร้างตัวเลขสุ่มในเกม
นี่คือตัวอย่างเอาต์พุตของส่วนที่ไม่มีการใส่ความคิดเห็น:
5456313909
1427223941
ว้าว! จะดำเนินการเกือบ 4 Math.randomครั้งเร็วกว่า
ฉันจำได้ว่าอ่านหนังสือที่Math.randomใช้System.nanoTime()แล้วและโมดูลัสและการแบ่งส่วน มันจำเป็นจริงๆเหรอ? อัลกอริทึมของฉันทำงานได้เร็วขึ้นมากและดูเหมือนว่าจะค่อนข้างสุ่ม
ฉันมีสองคำถาม:
- อัลกอริทึมของฉัน "ดีพอ" (สำหรับพูดเกมที่ตัวเลขสุ่มจริง ๆไม่สำคัญเกินไป) หรือไม่?
 - ทำไม
Math.randomทำมากเมื่อมันดูเหมือนการคูณง่าย ๆ และการตัดทศนิยมจะพอเพียง? 
new QuickRandom(0,5) new QuickRandom(.5, 2)ทั้งคู่จะส่งผลลัพธ์ 0 สำหรับหมายเลขของคุณซ้ำ ๆ
                


