Java实现带有权重随机算法的示例详解

 更新时间:2023年10月10日 15:07:51   作者:prettyspider  
这篇文章主要为大家详细介绍了Java如何实现带有权重随机算法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的小伙伴可以跟随小编一起学习一下

1.什么是权重比例

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

如何计算

有一个对象集合为[A,B,C,D,E,F,G,H,I,J],其对象的全红

总权重为10

每一个对象的权重为1/10=0.1

2.什么是权重覆盖区域

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

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

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

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

int binarySearch(double[] a, double key) 

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

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

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

4.IO读取和保存数据

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

字符缓冲输入流:使用readLine()获取一行的数据

字符换种输出流:使用newLine()进行换行,相较于添加写入  \r\n要简便

5.算法实现

1.建立的JavaBean类

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.算法实现

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

到此这篇关于Java实现带有权重随机算法的示例详解的文章就介绍到这了,更多相关Java随机算法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅析java中String类型中“==”与“equal”的区别

    浅析java中String类型中“==”与“equal”的区别

    这篇文章主要介绍了浅析java中String类型中“==”与“equal”的区别,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Java NIO原理图文分析及代码实现

    Java NIO原理图文分析及代码实现

    本文主要介绍Java NIO原理的知识,这里整理了详细资料及简单示例代码和原理图,有需要的小伙伴可以参考下
    2016-09-09
  • java实现mp3合并的方法

    java实现mp3合并的方法

    这篇文章主要介绍了java实现mp3合并的方法,是Java操作多媒体文件的一个典型应用,非常具有参考借鉴价值,需要的朋友可以参考下
    2014-10-10
  • Java 数据流之Broadcast State

    Java 数据流之Broadcast State

    这篇文章主要介绍了Java 数据流之Broadcast State,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Project Reactor源码解析publishOn使用示例

    Project Reactor源码解析publishOn使用示例

    这篇文章主要为大家介绍了Project Reactor源码解析publishOn使用示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Java 超详细讲解ThreadLocal类的使用

    Java 超详细讲解ThreadLocal类的使用

    写SpringBoot项目的时候,经常用到的一个保存用户信息的类就是Threadlocal,我们今天就来详细介绍一下这个类,感兴趣的朋友来看看吧
    2022-04-04
  • spring结合struts的代码详解

    spring结合struts的代码详解

    这篇文章主要介绍了spring结合struts的代码详解,需要的朋友可以参考下
    2017-09-09
  • Java基础知识精通各种运算符

    Java基础知识精通各种运算符

    计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量,本篇对大家的学习或工作具有一定的价值,需要的朋友可以参考下
    2022-04-04
  • Idea中如何调出Run dashboard 或services窗口

    Idea中如何调出Run dashboard 或services窗口

    这篇文章主要介绍了Idea中如何调出Run dashboard 或services窗口问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • 基于ArrayList源码解析(基于JDK1.8)

    基于ArrayList源码解析(基于JDK1.8)

    这篇文章主要介绍了关于ArrayList源码解析(基于JDK1.8),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03

最新评论