课后作业2
动手动脑:
1.编写一个方法,使用以上算法生成指定数目(比如1000个)的随机整数。
解:import java.util.Arrays;
public class RandomNumberGenerator {
/**
* 使用线性同余生成器算法生成指定数量的随机整数
* @param count 要生成的随机整数数量
* @param seed 随机数种子
* @return 包含随机整数的数组
*/
public static int[] generateRandomNumbers(int count, long seed) {
if (count <= 0) {
throw new IllegalArgumentException("生成数量必须大于0");
}
int[] randomNumbers = new int[count];
long current = seed;
// 线性同余生成器参数 (使用Java默认随机数生成器的参数)
long a = 25214903917L; // 乘数
long c = 11L; // 增量
long m = (long) Math.pow(2, 48); // 模数 2^48
for (int i = 0; i < count; i++) {
// 线性同余公式: X_{n+1} = (a * X_n + c) mod m
current = (a * current + c) % m;
// 取高32位作为随机数,转换为int类型
randomNumbers[i] = (int) (current >>> 16);
}
return randomNumbers;
}
/**
* 使用系统时间作为种子生成随机数
* @param count 要生成的随机整数数量
* @return 包含随机整数的数组
*/
public static int[] generateRandomNumbers(int count) {
return generateRandomNumbers(count, System.currentTimeMillis());
}
/**
* 测试方法
*/
public static void main(String[] args) {
// 生成10个随机数
int[] randomNumbers1 = generateRandomNumbers(10, 12345L);
System.out.println("使用种子12345生成的10个随机数:");
System.out.println(Arrays.toString(randomNumbers1));
// 生成1000个随机数
int[] randomNumbers2 = generateRandomNumbers(1000);
System.out.println("\n使用系统时间作为种子生成的1000个随机数:");
// 统计前20个
System.out.print("前20个随机数: ");
for (int i = 0; i < 20 && i < randomNumbers2.length; i++) {
System.out.print(randomNumbers2[i] + " ");
}
System.out.println("...");
// 基本统计信息
System.out.println("\n统计信息:");
System.out.println("总数: " + randomNumbers2.length);
System.out.println("第一个: " + randomNumbers2[0]);
System.out.println("最后一个: " + randomNumbers2[randomNumbers2.length - 1]);
// 验证范围(应该是32位有符号整数范围)
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
for (int num : randomNumbers2) {
if (num < min) min = num;
if (num > max) max = num;
}
System.out.println("最小值: " + min);
System.out.println("最大值: " + max);
}
}
2. 请看以下代码,你发现了有什么特殊之处吗?
解:该段代码使用了方法重载,这段代码方法名相同;参数类型不同,参数个数不同,或者是参数类型的顺序不同。提高了代码的灵活性和可读性。
课后作业
- 四则运算课堂测试一
阶段1:像二柱子那样,花二十分钟写一个能自动生成30道小学四则运算题目的 “软件”
解:import java.util.Random;
public class PrimarySchoolMathGenerator {
private static Random random = new Random();
public static void main(String[] args) {
System.out.println("小学生四则运算练习题");
System.out.println("====================");
System.out.println();
// 生成30道题目
for (int i = 1; i <= 30; i++) {
String exercise = generateExercise();
System.out.println(i + ". " + exercise);
}
System.out.println();
System.out.println("加油!做完记得检查哦!");
}
/**
* 生成一道四则运算题目
*/
private static String generateExercise() {
// 随机选择运算类型:0-加法,1-减法,2-乘法,3-除法
int operation = random.nextInt(4);
switch (operation) {
case 0:
return generateAddition();
case 1:
return generateSubtraction();
case 2:
return generateMultiplication();
case 3:
return generateDivision();
default:
return generateAddition();
}
}
/**
* 生成加法题目(和不超过100)
*/
private static String generateAddition() {
int a = random.nextInt(50) + 1; // 1-50
int b = random.nextInt(50) + 1; // 1-50
// 确保和不超过100
while (a + b > 100) {
a = random.nextInt(50) + 1;
b = random.nextInt(50) + 1;
}
return a + " + " + b + " = ";
}
/**
* 生成减法题目(结果不为负数)
*/
private static String generateSubtraction() {
int a = random.nextInt(50) + 10; // 10-59
int b = random.nextInt(a) + 1; // 1-a,确保结果不为负数
return a + " - " + b + " = ";
}
/**
* 生成乘法题目(乘数不超过10,积不超过100)
*/
private static String generateMultiplication() {
int a = random.nextInt(10) + 1; // 1-10
int b = random.nextInt(10) + 1; // 1-10
// 确保积不超过100
while (a * b > 100) {
a = random.nextInt(10) + 1;
b = random.nextInt(10) + 1;
}
return a + " × " + b + " = ";
}
/**
* 生成除法题目(确保能整除)
*/
private static String generateDivision() {
// 先确定除数(1-10)
int divisor = random.nextInt(10) + 1;
// 再确定商(1-10)
int quotient = random.nextInt(10) + 1;
// 被除数 = 除数 × 商
int dividend = divisor * quotient;
// 确保被除数不超过100
while (dividend > 100) {
divisor = random.nextInt(10) + 1;
quotient = random.nextInt(10) + 1;
dividend = divisor * quotient;
}
return dividend + " ÷ " + divisor + " = ";
}
}
2. 四则运算课堂测试二
阶段2:
(1)要求题目避免重复,减法不允许出现负数,乘法结果不允许出现四位数,除法必须整除不允许出现小数;
(2)实现在线实时答题,并在答题结束后,统计显示错题数,正确率;
(3)增加倒计时功能,要求在指定时间内完成测试,超时未做完视为错题。
要求上述内容编写方法实现。
解:import java.util.;
import java.util.concurrent.;
public class AdvancedMathTestSystem {
private static Random random = new Random();
private static Scanner scanner = new Scanner(System.in);
private static Set
// 题目和答案存储
private static List<String> exercises = new ArrayList<>();
private static List<Integer> correctAnswers = new ArrayList<>();
private static List<Integer> userAnswers = new ArrayList<>();
// 测试配置
private static final int TOTAL_QUESTIONS = 10; // 题目数量
private static final int TIME_LIMIT = 60; // 时间限制(秒)
public static void main(String[] args) {
System.out.println("小学生四则运算在线测试系统");
System.out.println("========================");
System.out.println("规则说明:");
System.out.println("- 共 " + TOTAL_QUESTIONS + " 道题目");
System.out.println("- 时间限制: " + TIME_LIMIT + " 秒");
System.out.println("- 超时未完成的题目视为错误");
System.out.println("========================");
// 生成不重复的题目
generateUniqueExercises(TOTAL_QUESTIONS);
// 开始测试(带倒计时)
startTimedTest();
// 显示结果统计
showTestResults();
scanner.close();
}
/**
* 生成指定数量的不重复题目
*/
private static void generateUniqueExercises(int count) {
int attempts = 0;
int maxAttempts = count * 10; // 防止无限循环
while (exercises.size() < count && attempts < maxAttempts) {
String exercise = generateExercise();
// 检查是否重复
if (!generatedExercises.contains(exercise)) {
exercises.add(exercise);
generatedExercises.add(exercise);
// 计算并存储正确答案
int answer = calculateAnswer(exercise);
correctAnswers.add(answer);
}
attempts++;
}
// 如果无法生成足够的不重复题目,用重复题目补足
while (exercises.size() < count) {
String exercise = generateExercise();
exercises.add(exercise);
int answer = calculateAnswer(exercise);
correctAnswers.add(answer);
}
}
/**
* 生成一道四则运算题目
*/
private static String generateExercise() {
int operation = random.nextInt(4);
switch (operation) {
case 0: return generateAddition();
case 1: return generateSubtraction();
case 2: return generateMultiplication();
case 3: return generateDivision();
default: return generateAddition();
}
}
/**
* 生成加法题目(和不超过100)
*/
private static String generateAddition() {
int a = random.nextInt(50) + 1;
int b = random.nextInt(50) + 1;
// 确保和不超过100
while (a + b > 100) {
a = random.nextInt(50) + 1;
b = random.nextInt(50) + 1;
}
return a + " + " + b + " = ";
}
/**
* 生成减法题目(结果不为负数)
*/
private static String generateSubtraction() {
int a = random.nextInt(50) + 10;
int b = random.nextInt(a) + 1; // 确保结果不为负数
return a + " - " + b + " = ";
}
/**
* 生成乘法题目(积不超过三位数)
*/
private static String generateMultiplication() {
int a = random.nextInt(20) + 1; // 1-20
int b = random.nextInt(10) + 1; // 1-10
// 确保积不超过三位数(即不超过999)
while (a * b > 999) {
a = random.nextInt(20) + 1;
b = random.nextInt(10) + 1;
}
return a + " × " + b + " = ";
}
/**
* 生成除法题目(确保能整除)
*/
private static String generateDivision() {
int divisor = random.nextInt(10) + 1; // 1-10
int quotient = random.nextInt(10) + 1; // 1-10
int dividend = divisor * quotient;
// 确保被除数不超过100
while (dividend > 100) {
divisor = random.nextInt(10) + 1;
quotient = random.nextInt(10) + 1;
dividend = divisor * quotient;
}
return dividend + " ÷ " + divisor + " = ";
}
/**
* 开始带倒计时的测试
*/
private static void startTimedTest() {
System.out.println("\n测试开始!剩余时间: " + TIME_LIMIT + " 秒");
System.out.println("========================");
// 创建倒计时线程
CountDownLatch countDownLatch = new CountDownLatch(1);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
int remainingTime = TIME_LIMIT;
@Override
public void run() {
if (remainingTime <= 0) {
System.out.println("\n\n时间到!测试结束。");
countDownLatch.countDown();
this.cancel();
return;
}
// 每10秒显示一次剩余时间
if (remainingTime % 10 == 0 || remainingTime <= 5) {
System.out.println("剩余时间: " + remainingTime + " 秒");
}
remainingTime--;
}
}, 0, 1000); // 每秒执行一次
// 记录开始时间
long startTime = System.currentTimeMillis();
// 开始答题
for (int i = 0; i < exercises.size(); i++) {
// 检查是否超时
long elapsedTime = (System.currentTimeMillis() - startTime) / 1000;
if (elapsedTime >= TIME_LIMIT) {
System.out.println("\n时间到!未完成的题目视为错误。");
// 为未答题的题目填充-1作为错误标记
for (int j = i; j < exercises.size(); j++) {
userAnswers.add(-1);
}
break;
}
System.out.print((i + 1) + ". " + exercises.get(i));
String input = scanner.nextLine().trim();
try {
int answer = Integer.parseInt(input);
userAnswers.add(answer);
} catch (NumberFormatException e) {
// 输入无效,视为错误
userAnswers.add(-1);
System.out.println(" 输入无效,已记录为错误答案");
}
}
// 停止计时器
timer.cancel();
// 确保所有题目都有用户答案
while (userAnswers.size() < exercises.size()) {
userAnswers.add(-1);
}
}
/**
* 显示测试结果统计
*/
private static void showTestResults() {
System.out.println("\n\n测试结果统计");
System.out.println("============");
int correctCount = 0;
List<Integer> wrongQuestions = new ArrayList<>();
// 统计正确率和错题
for (int i = 0; i < exercises.size(); i++) {
if (userAnswers.get(i) == correctAnswers.get(i)) {
correctCount++;
} else {
wrongQuestions.add(i + 1); // 记录错题编号
}
}
// 显示统计信息
double accuracy = (double) correctCount / exercises.size() * 100;
System.out.println("总题数: " + exercises.size());
System.out.println("答对题数: " + correctCount);
System.out.println("答错题数: " + (exercises.size() - correctCount));
System.out.printf("正确率: %.2f%%\n", accuracy);
// 显示错题详情
if (!wrongQuestions.isEmpty()) {
System.out.println("\n错题列表:");
for (int questionNum : wrongQuestions) {
int index = questionNum - 1;
System.out.println(questionNum + ". " + exercises.get(index) +
"你的答案: " +
(userAnswers.get(index) == -1 ? "未作答" : userAnswers.get(index)) +
", 正确答案: " + correctAnswers.get(index));
}
System.out.println("\n建议重点复习以上错题!");
} else {
System.out.println("\n太棒了!全部答对!");
}
}
/**
* 计算题目的正确答案
*/
private static int calculateAnswer(String exercise) {
if (exercise.contains("+")) {
String[] parts = exercise.split(" \\+ ");
int a = Integer.parseInt(parts[0]);
int b = Integer.parseInt(parts[1].split(" ")[0]);
return a + b;
} else if (exercise.contains("-")) {
String[] parts = exercise.split(" - ");
int a = Integer.parseInt(parts[0]);
int b = Integer.parseInt(parts[1].split(" ")[0]);
return a - b;
} else if (exercise.contains("×")) {
String[] parts = exercise.split(" × ");
int a = Integer.parseInt(parts[0]);
int b = Integer.parseInt(parts[1].split(" ")[0]);
return a * b;
} else if (exercise.contains("÷")) {
String[] parts = exercise.split(" ÷ ");
int a = Integer.parseInt(parts[0]);
int b = Integer.parseInt(parts[1].split(" ")[0]);
return a / b;
}
return 0;
}
}

浙公网安备 33010602011771号