线性同余法随机数生成器

 

线性同余法随机数生成器

/**
 * 线性同余法.  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

posted @ 2018-08-03 20:26  嗷嗷学技术  阅读(2587)  评论(0)    收藏  举报