带有权重的随机算法

1.什么是权重比例

权重比例计算即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。

如何计算

ini 复制代码
有一个对象集合为[A,B,C,D,E,F,G,H,I,J],其对象的全红
总权重为10
每一个对象的权重为1/10=0.1

2.什么是权重覆盖区域

权重覆盖区域是对象在整体权重范围中的锁分配到的区域

因此在计算权重时将对应的权重比例放入到数组中,便于后期计算权重覆盖区域

3.如何随机的获取对应的区域

使用java数据工具列Arrays的binarySearch()

java 复制代码
int binarySearch(double[] a, double key) 

这个方法会根据key找到 -插入点索引-1

对应的插入点为 -结果-1

当获取到指定的权重覆盖区域,对其对应的对象的权重按照指定比例进行修改,并保存数据

4.IO读取和保存数据

可使用的类很多,但是建议使用字符流的高级流--缓冲流,可以在简化操作步骤

scss 复制代码
字符缓冲输入流:使用readLine()获取一行的数据
字符换种输出流:使用newLine()进行换行,相较于添加写入  \r\n要简便

#5.算法实现

1。建立的JavaBean类

typescript 复制代码
package com.prettyspiderList.train;

/**
 * @author prettyspider
 * @ClassName Student
 * @description: TODO
 * @date 2023/8/4 17:28
 * @Version V1.0
 */

public class Student {
    private String name;
    private int age;

    public Student() {
    }

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

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age) {
        this.age = age;
    }

    public String toString() {
        return "Student{name = " + name + ", age = " + age + "}";
    }
}

2.算法实现

ini 复制代码
package com.prettyspiderList.Map.train;

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

/**
 * @author prettyspider
 * @ClassName test04
 * @description: TODO
 * @date 2023/9/7 21:35
 * @Version V1.0
 */

public class test04 {
    /**
     * txt文件中事先准备号一些学生信息,每个学生的信息独占一行
     * 要求1:
     *      每次被点到的学生,再次被点到的概率再原先的基础上降低一半
     *      举例: 80个学生,点名2次,每次都点到a,概率变化
     *      1: 1.25&
     *      2.a 0.625% 其他人1.2579%
     */
    public static void main(String[] args) throws IOException {
        /**
         * 带权重的随机算法:
         *      根据总权重,获取每个对象的占比
         *
         */
        //创建student集合
        ArrayList<Student> list = new ArrayList<>();

        // 创建输入流
        BufferedReader reader = new BufferedReader(new FileReader(".\\com\\prettyspiderList\\Map\\train\\stu.txt"));
        String line;
        while ((line = reader.readLine()) != null) {
            String[] arr = line.split("-");
            list.add(new Student(arr[0], arr[1], Integer.parseInt(arr[2]), Double.valueOf(arr[3])));
        }

        // 关流
        reader.close();


        //计算权重
        // 1.获取总权重
        double weight = 0.0;

        for (Student stu : list) {
            weight += stu.getWeight();
        }
        // 2.获取单个权重
        double[] wightArr = new double[list.size()];
        for (int i = 0; i < list.size(); i++) {
            wightArr[i] = list.get(i).getWeight() / weight;
        }
        System.out.println(Arrays.toString(wightArr));

        // 每个的权重占比,其前面一个的权重加自己的权重, 表示的是在这个范围内是对应的对象
        for (int i = 1; i < wightArr.length; i++) {
            wightArr[i] = wightArr[i] + wightArr[i - 1];
        }
        System.out.println(Arrays.toString(wightArr));

        // 随机生成一个0-1之间的随机数
        Random random = new Random();
        double key = random.nextDouble(1);
        System.out.println(key);
        // 二分查找法:方法返回: 结果=-插入点-1
        // 则插入点=-结果-1
        int index = -Arrays.binarySearch(wightArr, key) -1;

        // 对获取到的对象的权重减半
        double num = list.get(index).getWeight() / 2;
        list.get(index).setWeight(num);

        System.out.println(list.get(index));

        // 将数据协会到文件中
        BufferedWriter writer = new BufferedWriter(new FileWriter(".\\com\\prettyspiderList\\Map\\train\\stu.txt"));
        for (Student student : list) {
            writer.write(student.toString());
            writer.newLine();
        }

        // 关闭流
        writer.close();
    }
}

测试数据 权重算法测试数据

相关推荐
墨痕诉清风3 分钟前
java漏洞集合工具(Struts2、Fastjson、Weblogic(xml)、Shiro、Log4j、Jboss、SpringCloud)
xml·java·struts·安全·web安全·spring cloud·log4j
程序员阿鹏6 分钟前
SpringBoot自动装配原理
java·开发语言·spring boot·后端·spring·tomcat·maven
Andy工程师7 分钟前
一个接口可以有多个实现类
java
老华带你飞13 分钟前
工会管理|基于springboot 工会管理系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·spring
自在极意功。13 分钟前
MyBatis配置文件详解:environments、transactionManager与dataSource全面解析
java·数据库·tomcat·mybatis
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ18 分钟前
配置springdoc swagger开关
java
Echo flower21 分钟前
Spring Boot WebFlux 实现流式数据传输与断点续传
java·spring boot·后端
没有bug.的程序员27 分钟前
微服务中的数据一致性困局
java·jvm·微服务·架构·wpf·电商
鸽鸽程序猿32 分钟前
【Redis】Java客户端使用Redis
java·redis·github
悦悦子a啊32 分钟前
使用 Java 集合类中的 LinkedList 模拟栈以此判断字符串是否是回文
java·开发语言