下列代码中人为的规定了是20个人.
RandomTest.java
import java.util.Random;
import java.util.Scanner;
public class RandomTest {
public static void main(String[] args) {
/**
* 定义一个工具类
*/
Tool tool = new Tool();
String[] names = new String[20]; // 定义一个长度为20的名字数组,并给名字赋值
names = tool.addName(names);
int[] marks = new int[20]; //定义一个长度为20的标记数组,初始化为0
double[] scores = new double[20]; // 定义一个长度为20的总分数数组,初始化为0
int[] times = new int[20]; // 定义一个长度为20的答题次数数组,初始化为0
int[] weights = new int[20]; // 定义一个长度为20的权重,初始化为0
int sumPeople = 19; // 判断抽取人的次数,在没每个人都被提问一次时
int sumTime = 0; // 记录在二次重复提取人时,提取人的次数,处理重复提取问题
Random random = new Random();
Scanner in = new Scanner(System.in);
while (true) {
/**
* 首先保证所有的人都被提问到
*/
while ( sumPeople >= 0) {
int point = random.nextInt(20); // 随机抽取被提问人的序号
if (marks[point] != 1) { // 判断抽取到的人是否被提问过,如果提问过则重新随机抽取
System.out.println("当前为: " + names[point]);
marks[point] = 1;
times[point] += 1; // 统计学生回答问题的次数
scores[point] = scores[point] + in.nextDouble(); // 统计学生回答问题的总成绩
weights[point] = (int)( scores[point] / times[point] - 11 ) * (-1); // 根据总成绩和次数来求得权值
sumPeople -= 1;
}
}
int weightSum = 0; // 求权值的和
for(int weight : weights) {
weightSum += weight;
}
int point = random.nextInt(weightSum); // 从权值和中随机取出数值,用来找对应的学生的位置
int variable = 0; // 记录人成绩的权值,用来判断随机数落在哪个范围内
for (int i = 0; i < 20; i++ ) {
variable += weights[i];
if (variable >= point && marks[i] != 0) { // marks[i] != 0用来保证同一个人不能被重复提问
System.out.println("二次当前为: " + names[i]);
times[i] += 1;
scores[i] = scores[i] + in.nextDouble();
weights[i] = (int)( scores[i] / times[i] - 11 ) * (-1);
marks[i] = 0;
sumTime += 1;
break;
}
}
if (sumTime % 20 == 0) {
for (int i = 0; i < 20; i ++) {
marks[i] = 0;
}
}
}
}
}
Tool.java
public class Tool {
/**
* 给名字数组初始化
* @param names
* @return
*/
public String[] addName(String[] names) {
for (int i = 0; i < names.length;i++) {
names[i] = "100" + i;
}
return names;
}
}