IO流练习之随机权重算法

该文章介绍了一个基于Java的权重随机算法,通过读取文件中的学生信息,计算每个学生的权重占比,并使用二分查找进行随机抽取。抽取后,会动态调整被抽取学生的权重,确保概率分布的实时性。整个过程涉及到了文件IO、集合操作和随机数生成。
摘要由CSDN通过智能技术生成

由于作者之前偷懒有一些代码没敲完,所以现在继续补基础老老实实敲代码。敲代码使我快乐(笑

假设又十个人,每次随机抽取一个人,抽取一次就让这个人下一次抽中的几率减小。

设计此权重算法。

假设十个人占据了一条直线,分化成等份的十块,每次抽取时会随机出一个数字,利用二分查找找到抽取出数字的位置,如此来获取位置。

同时下一次再抽取的时候会重新设置抽取权重,将抽取到的权重降低。注意:我们每次都会计算总权重,用每个人的权重/总权重,计算出来的结果才是被抽取的概率。

技术栈:Arrays,集合,IO流

package IO流.综合练习;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;

public class 权重随机算法 {
    /*
    在微服务中,因为访问的人数过大,所以我们可以将其分成一部分一部分的去给每个服务器布置任务
    通过权重算法,我们可以得到哪个服务器的压力相对较大,如果这个服务器的压力过大,我们会进行处理
    今天不思考那么久远的东西,仅仅处理权重随机算法
     */
    /*

     */
    public static void main(String[] args) throws IOException {

        //1、将文件中所有的学生信息读取到内存中
        ArrayList<Student> list=new ArrayList<>();
        BufferedReader br=new BufferedReader(new FileReader("/Users/tangshaojie/IdeaProjects/basecode/day02/src/IO流/综合练习/names.txt"));
        String line;
        while ((line=br.readLine())!=null){
            String[] arr=line.split("-");
            //这里读取到的全是String类型,需要将其转换好类型才能调用构造方法创建学生对象
            Student stu=new Student(arr[0],arr[1],Integer.parseInt(arr[2]),Double.parseDouble(arr[3]));
            list.add(stu);
        }
        //System.out.println(list);
        br.close();

        //2、计算权重的总和
        double weight=0;
        for (Student stu:list){
            weight=weight+stu.getWeight();
        }

        //3、计算每一个人的实际占比
        double[] arr=new double[list.size()];
        int index=0;
        for (Student stu:list){
            arr[index]=stu.getWeight()/weight;
            index++;
        }
        //Arrays类,包括了数组的各种常用操作API
        //System.out.println(Arrays.toString(arr));

        //4、计算每一个人的权重占比范围
        //十个人对应一条线上十个小块
        for (int i = 1; i < arr.length; i++) {
            arr[i]=arr[i]+arr[i-1];//让每一位加上后一位变成 0.1 0.2 0.3 0.4这样子
        }
        //System.out.println(Arrays.toString(arr));

        //5、随机抽取
        //获取一个0.0-1.0之间的随机数
        //double num=Math.random();
        Random r=new Random();
        double number=r.nextDouble(1.0);
        //判断number在arr之间的位置
        //二分查找法
        //数据如果不存在的话,他会返回:-插入点-1
        //获取number在数组中的正确插入点位置
        int index2 = -Arrays.binarySearch(arr, number)-1;
        //System.out.println(Arrays.toString(arr));
        //System.out.println(number);
        System.out.println(index2);
        Student student = list.get(index2);
        System.out.println(student);

        //6、修改当前学生的权重
        double w = student.getWeight() / 2;
        student.setWeight(w);
        System.out.println(list);//集合是里面存放的是地址值,所以你修改学生本身属性,集合里面就会随之更改

        //7、将集合的数据再次写到本地文件中,流在写入的时候会将原来的数据删除,参数一:路径 参数二:是否开启续写 append
        BufferedWriter bw=new BufferedWriter(new FileWriter("/Users/tangshaojie/IdeaProjects/basecode/day02/src/IO流/综合练习/names.txt",false));
        for (Student stu:list){
            bw.write(stu.toString());//在底层重写了toString方法
            bw.newLine();//字符缓冲流特有方法,实现跨平台的换行
        }
        bw.close();//流随用随开,不用就关
    }
}
package IO流.综合练习;

public class Student {
    private String name;
    private String gender;
    private int age;
    private double weight;

    public Student() {
    }

    public Student(String name, String gender, int age, double weight) {
        this.name = name;
        this.gender = gender;
        this.age = age;
        this.weight = weight;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public double getWeight() {
        return weight;
    }

    public void setWeight(double weight) {
        this.weight = weight;
    }

    @Override
    public String toString() {
        return name+"-"+gender+"-"+age+"-"+weight;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值