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();
- }
- }
复制代码 测试数据
权重算法测试数据
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |