线性同余法随机数生成器
/**
* 线性同余法. 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
