曹旭辉 发表于 2023-9-22 00:48:27

带有权重的随机算法

1.什么是权重比例

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

有一个对象集合为,其对象的全红
总权重为10
每一个对象的权重为1/10=0.12.什么是权重覆盖区域

权重覆盖区域是对象在整体权重范围中的锁分配到的区域
https://img2023.cnblogs.com/blog/3047082/202309/3047082-20230918104002926-1408263315.png
因此在计算权重时将对应的权重比例放入到数组中,便于后期计算权重覆盖区域
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, arr, Integer.parseInt(arr), Double.valueOf(arr)));
      }

      // 关流
      reader.close();


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

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

      // 每个的权重占比,其前面一个的权重加自己的权重, 表示的是在这个范围内是对应的对象
      for (int i = 1; i < wightArr.length; i++) {
            wightArr = wightArr + wightArr;
      }
      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();
    }
}测试数据
权重算法测试数据

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: 带有权重的随机算法