老司机的思路:
先生成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) {
List<Student> l = new ArrayList<Student>();
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<Integer>
* set 随机数结果集
*/
public static void randomSet(int min, int max, int n, HashSet<Integer> 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;
}
}