线性同余法随机数生成器


 

线性同余法随机数生成器

/**
 * 线性同余法.  rand[n + 1] = (a * rand[n] + b) % length
 */
public class RandomNumber {
    private static final int a = 1664525;
    private static final int b = 1013904223;
    private static final int m = 0x7FFF_FFFF;
    private final int length;
    private int rand;

    public RandomNumber(int seed, int length) {
        this.rand = seed * (this.length = length);
    }

    private int rand() {
        return (this.rand = a * rand + b & m);// 先计算乘法, 再计算加法, 然后计算按位与
    }

    public int next() {
        return rand() % length;
    }

    public int next0or1() {
        return next() < (length / 2) ? 0 : 1;
    }

    public List<Integer> getMany(int many) {
        return new ArrayList<Integer>(many) {{
            for (int i = 0; i < many; i++) add(next());
        }};
    }

    public static void main(String[] args) {
        RandomNumber rr = new RandomNumber(333, 100);
        // 输出 10 个100以内的随机数.
        for (int i = 0; i < 10; i++) {
            System.out.println(rr.next());
        }

        System.out.println("****************************");

        // 输出10个0 或者 1. 相当于抛硬币.
        for (int i = 0; i < 10; i++) {
            System.out.println(rr.next0or1());
        }
    }
}

 

参考: https://www.cnblogs.com/xkfz007/archive/2012/03/27/2420154.html


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM