老司机的思路:
先生成40个学生对象 放在list里 产生随机数 判断随机和学生Id是否一样 如果一样给他们设置是否到课和点名标记为TRUE 最后一个for循环 判断是不是都点过名了顺便记录到课人数
实现代码:
package test;public class Student { private String name; private int sid; private boolean flag; private boolean work = false; public Student(String name, int sid, boolean flag) { super(); this.name = name; this.sid = sid; this.flag = flag; } public boolean isWork() { return work; } public void setWork(boolean work) { this.work = work; } public Student() { super(); } @Override public String toString() { return "Student [name=" + name + ", sid=" + sid + ", work=" + work + "]"; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getSid() { return sid; } public void setSid(int sid) { this.sid = sid; } public boolean isFlag() { return flag; } public void setFlag(boolean flag) { this.flag = flag; }}package test;import java.util.ArrayList;import java.util.List;import java.util.Random;import java.util.Scanner;public class Main { public static void main(String[] args) { Listl = new ArrayList (); for (int i = 0; i < 40; i++) { l.add(new Student("学生" + (1 + i), 1000 + i + 1, false)); } System.out.println("开始点名!"); int x = 0; while (x == 0) { // 全局循环 int flag = 0; while (flag == 0) { // 单次循环 Random r = new Random(); int rd = r.nextInt(l.size()); for (int i = 0; i < l.size(); i++) { if (l.get(i).getSid() == (rd + 1000) && l.get(i).isFlag() == false) { int a = 0; while (a == 0) { // 输入正确 try { System.out.println(l.get(i).getName() + "\t" + l.get(i).getSid()); System.out.println("输入是否到课"); Scanner sn = new Scanner(System.in); boolean b = sn.nextBoolean(); if (b == true) { l.get(i).setWork(true); } else { l.get(i).setWork(false); } l.get(i).setFlag(true); a = 1; flag = 1; } catch (Exception e) { System.out.println("重新输入是否到课"); } } } } } int i, j = 0; for (i = 0; i < l.size(); i++) { if (l.get(i).isFlag() == false) { break; } if (l.get(i).isWork() == true) { j++; } if (i == l.size() - 1) { x = 1; System.out.println("点名完毕!"); System.out.println("到课情况:" + j + "人到!"); } } } }}
我的思路:
先生成40个学生对象,放入数组里,生成40个不重复的随机数,然后按照随机数依次叫人,直到叫完40个学生
package com.hr.app;import java.util.Arrays;import java.util.HashSet;import java.util.Random;import java.util.Scanner;/** * Call Name System 需求:有40个人,让开始后,随机得到其中的一个人,然后下一次再开始,又得到一个人 在一次运行时,同一个学生不能点2次 * * @author l * */public class App { public static void main(String[] args) { System.out.println("welcome use Call Name System"); System.out.println("Please input \"begin\" begin Call Name,\"end\" end System"); int[] person = new int[40]; for (int i = 0; i < person.length; i++) { person[i] = i; } boolean b = true; int[] arr = new int[40]; arr = randomArray(0, 40, 40); System.out.println(Arrays.toString(arr)); int i = 0; while (b) { Scanner input = new Scanner(System.in); String type = input.nextLine(); if (type.equals("begin")) { if (i < 40) { System.out.println("第" + arr[i] + "个"); i++; } else { b = false; System.out.println("点完了"); } } else if (type.equals("end")) { System.out.println("System end"); b = false; } else { System.out.println("Input error,Please re-enter"); } } } public void RandomNum(int max, int min) { long randomNum = System.currentTimeMillis(); int randomNumber = (int) randomNum % (max - min) + min; for (int i = 0; i < 10; i++) { System.out.println(randomNumber); } } public void RandomNum1(int max, int min) { int randomNumber = (int) Math.round(Math.random() * (max - min) + min); for (int i = 0; i < 10; i++) { System.out.println(randomNumber); } } public void RandomNum2(int max, int min) { long randomNum = System.currentTimeMillis(); Random random = new Random(randomNum); int randomNumber = random.nextInt(max) % (max - min + 1) + min; for (int i = 0; i < 10; i++) { System.out.println(randomNumber); } } /** * 随机指定范围内N个不重复的数 最简单最基本的方法 最简单最易理解的两重循环去重 * * @param min * 指定范围最小值 * @param max * 指定范围最大值 * @param n * 随机数个数 */ public static int[] randomCommon(int min, int max, int n) { if (n > (max - min + 1) || max < min) { return null; } int[] result = new int[n]; int count = 0; while (count < n) { int num = (int) (Math.random() * (max - min)) + min; boolean flag = true; for (int j = 0; j < n; j++) { if (num == result[j]) { flag = false; break; } } if (flag) { result[count] = num; count++; } } return result; } /** * 利用HashSet的特征,只能存放不同的值 随机指定范围内N个不重复的数 利用HashSet的特征,只能存放不同的值 * * @param min * 指定范围最小值 * @param max * 指定范围最大值 * @param n * 随机数个数 * @param HashSet* set 随机数结果集 */ public static void randomSet(int min, int max, int n, HashSet set) { if (n > (max - min + 1) || max < min) { return; } for (int i = 0; i < n; i++) { // 调用Math.random()方法 int num = (int) (Math.random() * (max - min)) + min; set.add(num);// 将不同的数存入HashSet中 } int setSize = set.size(); // 如果存入的数小于指定生成的个数,则调用递归再生成剩余个数的随机数,如此循环,直到达到指定大小 if (setSize < n) { randomSet(min, max, n - setSize, set);// 递归 } } /** * 随机指定范围内N个不重复的数 在初始化的无重复待选数组中随机产生一个数放入结果中, * 将待选数组被随机到的数,用待选数组(len-1)下标对应的数替换 然后从len-2里随机产生下一个随机数,如此类推 * * @param max * 指定范围最大值 * @param min * 指定范围最小值 * @param n * 随机数个数 * @return int[] 随机数结果集 */ public static int[] randomArray(int min, int max, int n) { int len = max - min + 1; if (max < min || n > len) { return null; } // 初始化给定范围的待选数组 int[] source = new int[len]; for (int i = min; i < min + len; i++) { source[i - min] = i; } int[] result = new int[n]; Random rd = new Random(); int index = 0; for (int i = 0; i < result.length; i++) { // 待选数组0到(len-2)随机一个下标 index = Math.abs(rd.nextInt() % len--); // 将随机到的数放入结果集 result[i] = source[index]; // 将待选数组中被随机到的数,用待选数组(len-1)下标对应的数替换 source[index] = source[len]; } return result; }}