欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java實(shí)現(xiàn)帶有權(quán)重隨機(jī)算法的示例詳解

 更新時間:2023年10月10日 15:07:51   作者:prettyspider  
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)帶有權(quán)重隨機(jī)算法,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下

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)文章

最新評論