算法:带权重随机算法

算法思想:对象权重 / 所有对象权重总和即每个对象相对应的概率

 public static void main(String[] args) throws IOException {
        //初始化每个人的权重

        //1.从文件中导入数据到集合
        BufferedReader br = new BufferedReader(new FileReader("D:\\zzz.txt"));
        //创建学生类集合
        ArrayList<Student> list = new ArrayList<>();
        //循环导入
        String str;
        while ((str = br.readLine()) != null) {
            //依次将字符串的内容录入到Student集合中
            Student stu = new Student();
            String[] arr = str.split("-");
            stu.setName(arr[0]);
            stu.setSex(arr[1]);
            stu.setAge(Integer.parseInt(arr[2]));
            stu.setWeight(Double.parseDouble(arr[3]));
            list.add(stu);
        }
        br.close();
        System.out.println(list);

        //2.计算学生的抽中概率
        //每个人的权重除以所有人的权重总和即每个人的概率
        //定义权重总和
        double weight = 0;
        for (Student student : list) {
            weight += student.getWeight();
        }
        System.out.println(weight);

        //3.定义数组存放每个人的概率
        double[] arr = new double[list.size()];
        arr[0] = list.get(0).getWeight() / weight;
        for (int i = 1; i < list.size(); i++) {
            arr[i] = arr[i - 1] + list.get(i).getWeight() / weight;
        }
        for (double v : arr) {
            System.out.print(v + " ");
        }
        System.out.println();

        //4.开始抽签,生成0-1之间的随机数,在哪个范围就是哪个人
        double random = Math.random();
        System.out.println(random);

        //5.查找在哪个范围内,用Arrays工具类的二分查找快速遍历
        //该类的二分查找细节:若在查找范围中找到对应数据则返回对应数据下标,
        //                  若在该插入位置中没有对应数据则该位置 负号下标 - 1
        //如:随机数0.4041886576958883此时应返回在[0.4-0.5)范围内的同学的下标,即4,而打印结果为-5,符合上面第二种情况,按照该规则计算数组下标即可
        // -下标 -1 = -5 => 下标 = 4
        int i = Arrays.binarySearch(arr, random);
        int index = -i -1;

        //6.打印抽到的同学,抽到的同学权重减半,减半后存入文件
        double halfWeight = list.get(index).getWeight() / 2;
        list.get(index).setWeight(halfWeight);
        System.out.println(list.get(index).getName());

        //7.依次将集合内容存回文件
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\zzz.txt"));
        for (Student student : list) {
            bw.write(student.toString());
            bw.newLine();
        }
        bw.close();
    }

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

食懵你啊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值