点名系统

老司机的思路:

先生成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;
	}
}

 

转载于:https://my.oschina.net/869088067/blog/1490016

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值