Java實(shí)現(xiàn)帶有權(quán)重隨機(jī)算法的示例詳解
1.什么是權(quán)重比例
權(quán)重比例計算即將各數(shù)值乘以相應(yīng)的權(quán)數(shù),然后加總求和得到總體值,再除以總的單位數(shù)。
如何計算
有一個對象集合為[A,B,C,D,E,F,G,H,I,J],其對象的全紅
總權(quán)重為10
每一個對象的權(quán)重為1/10=0.1
2.什么是權(quán)重覆蓋區(qū)域
權(quán)重覆蓋區(qū)域是對象在整體權(quán)重范圍中的鎖分配到的區(qū)域
因此在計算權(quán)重時將對應(yīng)的權(quán)重比例放入到數(shù)組中,便于后期計算權(quán)重覆蓋區(qū)域
3.如何隨機(jī)的獲取對應(yīng)的區(qū)域
使用java數(shù)據(jù)工具列Arrays的binarySearch()
int binarySearch(double[] a, double key)
這個方法會根據(jù)key找到 -插入點(diǎn)索引-1
對應(yīng)的插入點(diǎn)為 -結(jié)果-1
當(dāng)獲取到指定的權(quán)重覆蓋區(qū)域,對其對應(yīng)的對象的權(quán)重按照指定比例進(jìn)行修改,并保存數(shù)據(jù)
4.IO讀取和保存數(shù)據(jù)
可使用的類很多,但是建議使用字符流的高級流--緩沖流,可以在簡化操作步驟
字符緩沖輸入流:使用readLine()獲取一行的數(shù)據(jù)
字符換種輸出流:使用newLine()進(jìn)行換行,相較于添加寫入 \r\n要簡便
5.算法實(shí)現(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; } /** * 設(shè)置 * @param name */ public void setName(String name) { this.name = name; } /** * 獲取 * @return age */ public int getAge() { return age; } /** * 設(shè)置 * @param age */ public void setAge(int age) { this.age = age; } public String toString() { return "Student{name = " + name + ", age = " + age + "}"; } }
2.算法實(shí)現(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文件中事先準(zhǔn)備號一些學(xué)生信息,每個學(xué)生的信息獨(dú)占一行 * 要求1: * 每次被點(diǎn)到的學(xué)生,再次被點(diǎn)到的概率再原先的基礎(chǔ)上降低一半 * 舉例: 80個學(xué)生,點(diǎn)名2次,每次都點(diǎn)到a,概率變化 * 1: 1.25& * 2.a 0.625% 其他人1.2579% */ public static void main(String[] args) throws IOException { /** * 帶權(quán)重的隨機(jī)算法: * 根據(jù)總權(quán)重,獲取每個對象的占比 * */ //創(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]))); } // 關(guān)流 reader.close(); //計算權(quán)重 // 1.獲取總權(quán)重 double weight = 0.0; for (Student stu : list) { weight += stu.getWeight(); } // 2.獲取單個權(quán)重 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)); // 每個的權(quán)重占比,其前面一個的權(quán)重加自己的權(quán)重, 表示的是在這個范圍內(nèi)是對應(yīng)的對象 for (int i = 1; i < wightArr.length; i++) { wightArr[i] = wightArr[i] + wightArr[i - 1]; } System.out.println(Arrays.toString(wightArr)); // 隨機(jī)生成一個0-1之間的隨機(jī)數(shù) Random random = new Random(); double key = random.nextDouble(1); System.out.println(key); // 二分查找法:方法返回: 結(jié)果=-插入點(diǎn)-1 // 則插入點(diǎn)=-結(jié)果-1 int index = -Arrays.binarySearch(wightArr, key) -1; // 對獲取到的對象的權(quán)重減半 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(); } // 關(guān)閉流 writer.close(); } }
到此這篇關(guān)于Java實(shí)現(xiàn)帶有權(quán)重隨機(jī)算法的示例詳解的文章就介紹到這了,更多相關(guān)Java隨機(jī)算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
VerifyCodeServlet(一次性驗(yàn)證碼)
這篇文章主要介紹了VerifyCodeServlet一次性驗(yàn)證碼的使用方法2017-05-05Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析
這篇文章主要介紹了Go反射底層原理及數(shù)據(jù)結(jié)構(gòu)解析,反射的實(shí)現(xiàn)和interface的組成很相似,都是由“類型”和“數(shù)據(jù)值”構(gòu)成,下面小編分享更多相關(guān)內(nèi)容需要的小伙伴可以參考一下2022-06-06java子類調(diào)用父類的方法中包含子類重寫的實(shí)例方法
在本篇文章里小編給大家整理了關(guān)于java子類調(diào)用父類的方法中包含子類重寫的實(shí)例方法以及相關(guān)知識點(diǎn),需要的朋友們可以學(xué)習(xí)下。2019-09-09Maven實(shí)戰(zhàn)之搭建Maven私服和鏡像的方法(圖文)
本篇文章主要介紹了搭建Maven私服和鏡像的方法(圖文),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-12-12Java語法基礎(chǔ)之選擇結(jié)構(gòu)的if語句、switch語句詳解
這篇文章主要為大詳細(xì)介紹了Java語法基礎(chǔ)之選擇結(jié)構(gòu)的if語句、switch語句,感興趣的小伙伴們可以參考一下2016-09-09Spring Boot中利用JavaMailSender發(fā)送郵件的方法示例(附源碼)
這篇文章主要介紹了Spring Boot中利用JavaMailSender發(fā)送郵件的方法示例, 相信使用過Spring的眾多開發(fā)者都知道Spring提供了非常好用的JavaMailSender接口實(shí)現(xiàn)郵件發(fā)送。在Spring Boot的Starter模塊中也為此提供了自動化配置。需要的朋友可以參考借鑒。2017-02-02基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設(shè)計方案
這篇文章主要介紹了基于SpringCloudAlibaba+Skywalking的全鏈路監(jiān)控設(shè)計方案,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2024-01-01