由于作者之前偷懒有一些代码没敲完,所以现在继续补基础老老实实敲代码。敲代码使我快乐(笑
假设又十个人,每次随机抽取一个人,抽取一次就让这个人下一次抽中的几率减小。
设计此权重算法。
假设十个人占据了一条直线,分化成等份的十块,每次抽取时会随机出一个数字,利用二分查找找到抽取出数字的位置,如此来获取位置。
同时下一次再抽取的时候会重新设置抽取权重,将抽取到的权重降低。注意:我们每次都会计算总权重,用每个人的权重/总权重,计算出来的结果才是被抽取的概率。
技术栈:Arrays,集合,IO流
package IO流.综合练习;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
public class 权重随机算法 {
/*
在微服务中,因为访问的人数过大,所以我们可以将其分成一部分一部分的去给每个服务器布置任务
通过权重算法,我们可以得到哪个服务器的压力相对较大,如果这个服务器的压力过大,我们会进行处理
今天不思考那么久远的东西,仅仅处理权重随机算法
*/
/*
*/
public static void main(String[] args) throws IOException {
//1、将文件中所有的学生信息读取到内存中
ArrayList<Student> list=new ArrayList<>();
BufferedReader br=new BufferedReader(new FileReader("/Users/tangshaojie/IdeaProjects/basecode/day02/src/IO流/综合练习/names.txt"));
String line;
while ((line=br.readLine())!=null){
String[] arr=line.split("-");
//这里读取到的全是String类型,需要将其转换好类型才能调用构造方法创建学生对象
Student stu=new Student(arr[0],arr[1],Integer.parseInt(arr[2]),Double.parseDouble(arr[3]));
list.add(stu);
}
//System.out.println(list);
br.close();
//2、计算权重的总和
double weight=0;
for (Student stu:list){
weight=weight+stu.getWeight();
}
//3、计算每一个人的实际占比
double[] arr=new double[list.size()];
int index=0;
for (Student stu:list){
arr[index]=stu.getWeight()/weight;
index++;
}
//Arrays类,包括了数组的各种常用操作API
//System.out.println(Arrays.toString(arr));
//4、计算每一个人的权重占比范围
//十个人对应一条线上十个小块
for (int i = 1; i < arr.length; i++) {
arr[i]=arr[i]+arr[i-1];//让每一位加上后一位变成 0.1 0.2 0.3 0.4这样子
}
//System.out.println(Arrays.toString(arr));
//5、随机抽取
//获取一个0.0-1.0之间的随机数
//double num=Math.random();
Random r=new Random();
double number=r.nextDouble(1.0);
//判断number在arr之间的位置
//二分查找法
//数据如果不存在的话,他会返回:-插入点-1
//获取number在数组中的正确插入点位置
int index2 = -Arrays.binarySearch(arr, number)-1;
//System.out.println(Arrays.toString(arr));
//System.out.println(number);
System.out.println(index2);
Student student = list.get(index2);
System.out.println(student);
//6、修改当前学生的权重
double w = student.getWeight() / 2;
student.setWeight(w);
System.out.println(list);//集合是里面存放的是地址值,所以你修改学生本身属性,集合里面就会随之更改
//7、将集合的数据再次写到本地文件中,流在写入的时候会将原来的数据删除,参数一:路径 参数二:是否开启续写 append
BufferedWriter bw=new BufferedWriter(new FileWriter("/Users/tangshaojie/IdeaProjects/basecode/day02/src/IO流/综合练习/names.txt",false));
for (Student stu:list){
bw.write(stu.toString());//在底层重写了toString方法
bw.newLine();//字符缓冲流特有方法,实现跨平台的换行
}
bw.close();//流随用随开,不用就关
}
}
package IO流.综合练习;
public class Student {
private String name;
private String gender;
private int age;
private double weight;
public Student() {
}
public Student(String name, String gender, int age, double weight) {
this.name = name;
this.gender = gender;
this.age = age;
this.weight = weight;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public double getWeight() {
return weight;
}
public void setWeight(double weight) {
this.weight = weight;
}
@Override
public String toString() {
return name+"-"+gender+"-"+age+"-"+weight;
}
}