带有权重的随机算法

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()进行换行,相较于添加写入  rn要简便 

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

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

发表评论

评论已关闭。

相关文章