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 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(); }}
测试数据
权重算法测试数据