课后作业
动手动脑:
编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数。
import java.util.stream.LongStream;
import java.util.stream.Stream;
public final class Lehmer16807 {
// 参数
private static final long A = 16_807L; // 7^5
private static final long M = 0x7FFF_FFFFL; // 2^31-1
private static final long MASK = M; // 31 位全 1,用于快速取模
// 当前种子
private long seed;
/* 构造器:允许外部指定初始种子 */
public Lehmer16807(long seed) {
this.seed = seed & MASK; // 保证在 [0, M-1] 范围内
}
/* 生成下一个随机整数 [0, 2^31-2] */
public long nextLong() {
seed = (A * seed) % M;
return seed;
}
/* 生成下一个 int [0, 2^31-2] */
public int nextInt() {
return (int) nextLong();
}
/* 一次性生成 n 个随机数,返回 long[] */
public long[] nextLongs(int n) {
long[] ret = new long[n];
for (int i = 0; i < n; i++) {
ret[i] = nextLong();
}
return ret;
}
/* 返回一个无限流,惰性生成 */
public LongStream longs() {
return LongStream.generate(this::nextLong);
}
/* 简单测试 */
public static void main(String[] args) {
Lehmer16807 rng = new Lehmer16807(System.nanoTime() & 0x7FFF_FFFFL);
// 1. 生成 1000 个并打印前 10 个
long[] arr = rng.nextLongs(1000);
for (int i = 0; i < 10; i++) {
System.out.println(arr[i]);
}
// 2. 用流再取 5 个
rng.longs().limit(5).forEach(System.out::println);
}
}
请看以下代码,你发现了有什么特殊之处吗?
同名不同参
两个方法都叫 square,但一个形参是 int,另一个是 double。编译器根据调用时实参的类型来决定到底执行哪一个,这就是典型的“方法重载”。
返回值类型不相同
int square(int) 返回 int,double square(double) 返回 double。
在 Java 里,仅靠返回值不同是不足以区分重载方法的,必须依靠“参数列表”不同;而这里参数列表确实不同(类型不同),所以合法。

浙公网安备 33010602011771号