案例五

利用权重占比

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;  
    }  
  
}