0Pricing
Java Academy · 课时

随机范围与洗牌

有界随机数与集合洗牌

随机范围与洗牌 是 CoddyKit 上的免费 Java Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 Java Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 Java Academy 课程共包含 4 节课。

范围和随机打乱

实际程序很少只需要 0 到上界减 1。本课将介绍任意范围、随机打乱集合,以及选择随机元素。

自定义范围公式

要生成从 min 到 max(包含两端)的 int,请使用 min + rng.nextInt(max - min + 1)。

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rng = new Random();
        int min = 10, max = 20;
        int value = min + rng.nextInt(max - min + 1);
        System.out.println("10 to 20: " + value);
    }
}

带起点和上界的 nextInt

现代 Java 允许您直接调用 nextInt(origin, bound):包含起点,不包含上界。这样可以避免手动编写公式。

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rng = new Random();
        int value = rng.nextInt(10, 21);
        System.out.println("10 to 20: " + value);
    }
}

范围内的随机双精度数

要生成从 lo 到 hi 的 double,请使用 lo + rng.nextDouble() * (hi - lo)。

import java.util.Random;

public class Main {
    public static void main(String[] args) {
        Random rng = new Random();
        double lo = 5.0, hi = 7.5;
        double value = lo + rng.nextDouble() * (hi - lo);
        System.out.println(value);
    }
}

随机打乱 List

Collections.shuffle(list) 会将 List 原地随机重新排序。这非常适合用于洗牌和随机测验。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
        Collections.shuffle(deck);
        System.out.println(deck);
    }
}

可复现的随机打乱

将带种子的 Random 作为第二个参数传入,即可获得确定性的随机打乱:Collections.shuffle(list, new Random(seed))。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        List<Integer> deck = new ArrayList<>(List.of(1, 2, 3, 4, 5));
        Collections.shuffle(deck, new Random(99));
        System.out.println(deck);
    }
}

随机打乱需要可变 List

List.of(...) 会创建不可变列表。对它进行随机打乱会抛出 UnsupportedOperationException。请先将它包装为 new ArrayList<>(...)。

选择随机元素

生成一个随机索引,然后使用 get,即可选择随机元素。

import java.util.List;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        List<String> colors = List.of("red", "green", "blue");
        Random rng = new Random();
        String pick = colors.get(rng.nextInt(colors.size()));
        System.out.println("Chosen: " + pick);
    }
}

随机打乱数组

数组没有内置的随机打乱方法。经典做法是使用 Fisher-Yates 算法:将每个元素与一个随机选择的、早于或等于当前位置的索引交换。

import java.util.Arrays;
import java.util.Random;

public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};
        Random rng = new Random(3);
        for (int i = arr.length - 1; i > 0; i--) {
            int j = rng.nextInt(i + 1);
            int tmp = arr[i];
            arr[i] = arr[j];
            arr[j] = tmp;
        }
        System.out.println(Arrays.toString(arr));
    }
}

随机抽样

如果要抽取多个不重复的元素,可以先打乱副本,再取前几个元素;也可以使用 Set 记录已经选择的索引。对于较小的列表,先打乱再切片最简单。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> pool = new ArrayList<>(List.of(1, 2, 3, 4, 5, 6, 7, 8));
        Collections.shuffle(pool);
        List<Integer> sample = pool.subList(0, 3);
        System.out.println("Sample: " + sample);
    }
}

实用注意事项

需要完全随机的重新排序时,请使用随机打乱;需要有界值时,请使用自定义范围公式。还要始终注意:当上界应包含在范围内时,容易出现差一错误。

快速检查

请检验您对范围和随机打乱的理解。

回顾

您已经学会范围和随机打乱。

  • 对于范围,请使用 min + nextInt(max - min + 1) 或 nextInt(origin, bound)。
  • Collections.shuffle 会将可变列表原地重新排序。
  • 为随机打乱设置种子,可以实现可复现性。
  • 通过随机索引选择随机元素。

常见问题解答

「随机范围与洗牌」课时是免费的吗?

是的 — 「随机范围与洗牌」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 Java Academy 课程的其余内容,请升级到 CoddyKit PRO。 Java Academy 课程共包含 4 节课。

「随机范围与洗牌」这节课中我会学到什么?

有界随机数与集合洗牌 你通过在浏览器中直接运行的动手代码来练习 Java Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 Java Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 Java Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「随机范围与洗牌」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 Java Academy 课中编写并运行代码吗?

能。每节 Java Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. Math 类
  2. 生成随机数
  3. 随机范围与洗牌
  4. 数学舍入与界限
← 返回 Java Academy