Java實現(xiàn)帶有權重隨機算法的示例詳解
1.什么是權重比例
權重比例計算即將各數(shù)值乘以相應的權數(shù),然后加總求和得到總體值,再除以總的單位數(shù)。
如何計算
有一個對象集合為[A,B,C,D,E,F,G,H,I,J],其對象的全紅
總權重為10
每一個對象的權重為1/10=0.1
2.什么是權重覆蓋區(qū)域
權重覆蓋區(qū)域是對象在整體權重范圍中的鎖分配到的區(qū)域

因此在計算權重時將對應的權重比例放入到數(shù)組中,便于后期計算權重覆蓋區(qū)域
3.如何隨機的獲取對應的區(qū)域
使用java數(shù)據(jù)工具列Arrays的binarySearch()
int binarySearch(double[] a, double key)
這個方法會根據(jù)key找到 -插入點索引-1
對應的插入點為 -結果-1
當獲取到指定的權重覆蓋區(qū)域,對其對應的對象的權重按照指定比例進行修改,并保存數(shù)據(jù)
4.IO讀取和保存數(shù)據(jù)
可使用的類很多,但是建議使用字符流的高級流--緩沖流,可以在簡化操作步驟
字符緩沖輸入流:使用readLine()獲取一行的數(shù)據(jù)
字符換種輸出流:使用newLine()進行換行,相較于添加寫入 \r\n要簡便
5.算法實現(xiàn)
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.算法實現(xiàn)
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 {
/**
* 帶權重的隨機算法:
* 根據(jù)總權重,獲取每個對象的占比
*
*/
//創(chuàng)建student集合
ArrayList<Student> list = new ArrayList<>();
// 創(chuàng)建輸入流
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之間的隨機數(shù)
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));
// 將數(shù)據(jù)協(xié)會到文件中
BufferedWriter writer = new BufferedWriter(new FileWriter(".\\com\\prettyspiderList\\Map\\train\\stu.txt"));
for (Student student : list) {
writer.write(student.toString());
writer.newLine();
}
// 關閉流
writer.close();
}
}到此這篇關于Java實現(xiàn)帶有權重隨機算法的示例詳解的文章就介紹到這了,更多相關Java隨機算法內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
ThreadLocal數(shù)據(jù)存儲結構原理解析
這篇文章主要為大家介紹了ThreadLocal數(shù)據(jù)存儲結構原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Presto支持Elasticsearch數(shù)據(jù)源配置詳解
這篇文章主要為大家介紹了Presto支持Elasticsearch數(shù)據(jù)源配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12

