带有权重的随机算法

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

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

相关推荐
小海编码日记8 分钟前
Java八股-JVM & GC
java
全职计算机毕业设计13 分钟前
基于Java Web的校园失物招领平台设计与实现
java·开发语言·前端
东阳马生架构19 分钟前
商品中心—1.B端建品和C端缓存的技术文档
java
Chan1622 分钟前
【 SpringCloud | 微服务 MQ基础 】
java·spring·spring cloud·微服务·云原生·rabbitmq
LucianaiB25 分钟前
如何做好一份优秀的技术文档:专业指南与最佳实践
android·java·数据库
面朝大海,春不暖,花不开1 小时前
自定义Spring Boot Starter的全面指南
java·spring boot·后端
得过且过的勇者y1 小时前
Java安全点safepoint
java
夜晚回家1 小时前
「Java基本语法」代码格式与注释规范
java·开发语言
斯普信云原生组2 小时前
Docker构建自定义的镜像
java·spring cloud·docker
wangjinjin1802 小时前
使用 IntelliJ IDEA 安装通义灵码(TONGYI Lingma)插件,进行后端 Java Spring Boot 项目的用户用例生成及常见问题处理
java·spring boot·intellij-idea