课后作业

动手动脑:
编写一个方法,使用以上算法生成指定数目(比如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 里,仅靠返回值不同是不足以区分重载方法的,必须依靠“参数列表”不同;而这里参数列表确实不同(类型不同),所以合法。

posted @ 2025-10-08 10:39  poiurts  阅读(12)  评论(0)    收藏  举报