

案例五

利用权重占比
package com.qcqc.javaStudy;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
public class RandomRollCall {
public static void main(String[] args) throws IOException {
//1.读取数据,创建对象
ArrayList<Student> list = new ArrayList<>();
BufferedReader br = new BufferedReader(new FileReader("RandomName.txt"));
String line;
while ((line = br.readLine()) != null) {
String[] arr = line.split("-");
try {
list.add(new Student(arr[0], arr[1], Integer.parseInt(arr[2]), Double.parseDouble(arr[3])));
}catch (ArrayIndexOutOfBoundsException e){
System.out.println("学生“"+ arr[0]+"”未指定比重,默认值为100");
list.add(new Student(arr[0], arr[1], Integer.parseInt(arr[2]), 100.0));
}
}
br.close();
System.out.println("成功添加"+list.size()+"个学生!");
System.out.println("开始随机抽取学生~");
int count = 10000;//抽取次数
for (int i = 0; i < count; i++) {
String name = getSTU(list);
System.out.println(name);
}
}
private static String getSTU(ArrayList<Student> list) {
//2.3.计算权重和占比,抽取成方法
double[] weightArr = getWeight(list);
int numIndex = getNumIndex(weightArr);
// 获取学生
Student stu = list.get(numIndex);
//5.修改指定学生的权重
double weightRe = stu.getWeight() / 2;
stu.setWeight(weightRe);
//6.增加其他学生的比重
double weightUP = weightRe / (double) (list.size() - 1);
// System.out.println("增加比重" + weightUP);
for (int i = 0; i < list.size(); i++) {
if (i != numIndex) {
Student s = list.get(i);
s.setWeight(s.getWeight() + weightUP);
}
}
//返回学生姓名
return stu.getName();
}
/*
* 获取随机位置 * */ private static int getNumIndex(double[] weightArr) {
//4.随机抽取
// 获取一个0-1.0之间的随机数 double num = Math.random();
// 利用二分法查找元素位置
int numIndex = Arrays.binarySearch(weightArr, num);//返回值是负的插入点位置-1
// 转换为位置 numIndex = -(numIndex + 1);
return numIndex;
}
/*
* 计算比重 * */ private static double[] getWeight(ArrayList<Student> list) {
//2.计算每一个人的权重占比
double weight = 0;
for (Student student : list) {
weight += student.getWeight();
}
double[] weightArr = new double[list.size()];
int index = 0;
for (Student student : list) {
weightArr[index] = student.getWeight() / weight;
index++;
}
//3.计算权重占比范围
for (int i = 1; i < weightArr.length; i++) {
weightArr[i] += weightArr[i - 1];
}
// System.out.println(Arrays.toString(weightArr));
// System.out.println("总权重" + weight);
return weightArr;
}
}