带有权重的随机算法

打印 上一主题 下一主题

主题 852|帖子 852|积分 2556

1.什么是权重比例

权重比例计算即将各数值乘以相应的权数,然后加总求和得到总体值,再除以总的单位数。
如何计算
  1. 有一个对象集合为[A,B,C,D,E,F,G,H,I,J],其对象的全红
  2. 总权重为10
  3. 每一个对象的权重为1/10=0.1
复制代码
2.什么是权重覆盖区域

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

因此在计算权重时将对应的权重比例放入到数组中,便于后期计算权重覆盖区域
3.如何随机的获取对应的区域

使用java数据工具列Arrays的binarySearch()
  1. int binarySearch(double[] a, double key)
复制代码
这个方法会根据key找到 -插入点索引-1
对应的插入点为 -结果-1
当获取到指定的权重覆盖区域,对其对应的对象的权重按照指定比例进行修改,并保存数据
4.IO读取和保存数据

可使用的类很多,但是建议使用字符流的高级流--缓冲流,可以在简化操作步骤
  1. 字符缓冲输入流:使用readLine()获取一行的数据
  2. 字符换种输出流:使用newLine()进行换行,相较于添加写入  \r\n要简便
复制代码
5.算法实现

1。建立的JavaBean类
  1. package com.prettyspiderList.train;
  2. /**
  3. * @author prettyspider
  4. * @ClassName Student
  5. * @description: TODO
  6. * @date 2023/8/4 17:28
  7. * @Version V1.0
  8. */
  9. public class Student {
  10.     private String name;
  11.     private int age;
  12.     public Student() {
  13.     }
  14.     public Student(String name, int age) {
  15.         this.name = name;
  16.         this.age = age;
  17.     }
  18.     /**
  19.      * 获取
  20.      * @return name
  21.      */
  22.     public String getName() {
  23.         return name;
  24.     }
  25.     /**
  26.      * 设置
  27.      * @param name
  28.      */
  29.     public void setName(String name) {
  30.         this.name = name;
  31.     }
  32.     /**
  33.      * 获取
  34.      * @return age
  35.      */
  36.     public int getAge() {
  37.         return age;
  38.     }
  39.     /**
  40.      * 设置
  41.      * @param age
  42.      */
  43.     public void setAge(int age) {
  44.         this.age = age;
  45.     }
  46.     public String toString() {
  47.         return "Student{name = " + name + ", age = " + age + "}";
  48.     }
  49. }
复制代码
2.算法实现
  1. package com.prettyspiderList.Map.train;
  2. import java.io.*;
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Random;
  6. /**
  7. * @author prettyspider
  8. * @ClassName test04
  9. * @description: TODO
  10. * @date 2023/9/7 21:35
  11. * @Version V1.0
  12. */
  13. public class test04 {
  14.     /**
  15.      * txt文件中事先准备号一些学生信息,每个学生的信息独占一行
  16.      * 要求1:
  17.      *      每次被点到的学生,再次被点到的概率再原先的基础上降低一半
  18.      *      举例: 80个学生,点名2次,每次都点到a,概率变化
  19.      *      1: 1.25&
  20.      *      2.a 0.625% 其他人1.2579%
  21.      */
  22.     public static void main(String[] args) throws IOException {
  23.         /**
  24.          * 带权重的随机算法:
  25.          *      根据总权重,获取每个对象的占比
  26.          *
  27.          */
  28.         //创建student集合
  29.         ArrayList<Student> list = new ArrayList<>();
  30.         // 创建输入流
  31.         BufferedReader reader = new BufferedReader(new FileReader(".\\com\\prettyspiderList\\Map\\train\\stu.txt"));
  32.         String line;
  33.         while ((line = reader.readLine()) != null) {
  34.             String[] arr = line.split("-");
  35.             list.add(new Student(arr[0], arr[1], Integer.parseInt(arr[2]), Double.valueOf(arr[3])));
  36.         }
  37.         // 关流
  38.         reader.close();
  39.         //计算权重
  40.         // 1.获取总权重
  41.         double weight = 0.0;
  42.         for (Student stu : list) {
  43.             weight += stu.getWeight();
  44.         }
  45.         // 2.获取单个权重
  46.         double[] wightArr = new double[list.size()];
  47.         for (int i = 0; i < list.size(); i++) {
  48.             wightArr[i] = list.get(i).getWeight() / weight;
  49.         }
  50.         System.out.println(Arrays.toString(wightArr));
  51.         // 每个的权重占比,其前面一个的权重加自己的权重, 表示的是在这个范围内是对应的对象
  52.         for (int i = 1; i < wightArr.length; i++) {
  53.             wightArr[i] = wightArr[i] + wightArr[i - 1];
  54.         }
  55.         System.out.println(Arrays.toString(wightArr));
  56.         // 随机生成一个0-1之间的随机数
  57.         Random random = new Random();
  58.         double key = random.nextDouble(1);
  59.         System.out.println(key);
  60.         // 二分查找法:方法返回: 结果=-插入点-1
  61.         // 则插入点=-结果-1
  62.         int index = -Arrays.binarySearch(wightArr, key) -1;
  63.         // 对获取到的对象的权重减半
  64.         double num = list.get(index).getWeight() / 2;
  65.         list.get(index).setWeight(num);
  66.         System.out.println(list.get(index));
  67.         // 将数据协会到文件中
  68.         BufferedWriter writer = new BufferedWriter(new FileWriter(".\\com\\prettyspiderList\\Map\\train\\stu.txt"));
  69.         for (Student student : list) {
  70.             writer.write(student.toString());
  71.             writer.newLine();
  72.         }
  73.         // 关闭流
  74.         writer.close();
  75.     }
  76. }
复制代码
测试数据
权重算法测试数据

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

曹旭辉

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表