帶有權重的隨機演算法

来源:https://www.cnblogs.com/prettyspider/archive/2023/09/18/17711363.html
-Advertisement-
Play Games

1.什麼是權重比例 權重比例計算即將各數值乘以相應的權數,然後加總求和得到總體值,再除以總的單位數。 如何計算 有一個對象集合為[A,B,C,D,E,F,G,H,I,J],其對象的全紅 總權重為10 每一個對象的權重為1/10=0.1 2.什麼是權重覆蓋區域 權重覆蓋區域是對象在整體權重範圍中的鎖分 ...


1.什麼是權重比例

權重比例計算即將各數值乘以相應的權數,然後加總求和得到總體值,再除以總的單位數。

如何計算

有一個對象集合為[A,B,C,D,E,F,G,H,I,J],其對象的全紅
總權重為10
每一個對象的權重為1/10=0.1

2.什麼是權重覆蓋區域

權重覆蓋區域是對象在整體權重範圍中的鎖分配到的區域
image
因此在計算權重時將對應的權重比例放入到數組中,便於後期計算權重覆蓋區域

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<Student> 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();
    }
}

測試數據
權重演算法測試數據


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 目錄前言必備理論知識:例子: 前言 有C#經驗,使用起來,駕輕就熟。 就是語法糖。但是也要熟悉用法,才好眾享絲滑。 內容參考: Chatjpt、文心一言 必備理論知識: 捕獲列表: []:預設不捕獲任何變數; [=]:預設以值捕獲所有變數;內部有一個相應的副本 [&]:預設以引用捕獲所有變數; [x ...
  • 變數 變數是用於存儲數據值的容器。 創建變數 Python沒有用於聲明變數的命令。 變數在您第一次為其分配值時被創建。 示例 x = 5 y = "John" print(x) print(y) 變數不需要聲明為特定類型,並且甚至在設置後可以更改類型。 示例 x = 4 # x的類型為int x = ...
  • 0 前言 一般初學者學習編碼和[錯誤處理]時,先知道[編程語言]有一種處理錯誤的形式或約定(如Java就拋異常),然後就開始用這些工具。但卻忽視這問題本質:處理錯誤是為了寫正確程式。可是 1 啥叫“正確”? 由解決的問題決定的。問題不同,解決方案不同。 如一個web介面接受用戶請求,參數age,也許 ...
  • 什麼是裝飾器,它們如何被使用,以及我們如何利用它們來構建代碼。我們將看到裝飾器是如何成為一個強大的工具,可以用來為我們的應用程式添加功能,並且可以在Python編程語言中找到。 裝飾器順序 在Python中,裝飾器是一個特殊的函數,可以修改另一個函數的行為。裝飾器是一種設計模式,它在不改變現有對象結 ...
  • dataclass 到 Python 中的 JSON JavaScript Object Notation或JSON表示使用編程語言中的文本組成的腳本(可執行)文件來存儲和傳輸數據。 Python通過JSON內置模塊支持JSON。因此,我們在Python腳本中導入JSON包,以利用這一能力。 JSO ...
  • 前言 很多時候,由於種種不可描述的原因,我們需要針對單個介面實現介面限流,防止訪問次數過於頻繁。這裡就用 redis+aop 實現一個限流介面註解 @RedisLimit 代碼 點擊查看RedisLimit註解代碼 import java.lang.annotation.*; /** * 功能:分佈 ...
  • 對重寫代碼說不。 以下為譯文: 1、重寫代碼消耗了12個月! 我們從頭開始重寫代碼浪費的時間。 你能想象在軟體行業,12個月的時間沒有任何新產品推出,沒有任何新版本更新嗎? 真的,我不由自主地問自己這個問題: 在這個快速發展的世界里,12月的時間能讓我們做多少事情? “2015年1月20日,星期二, ...
  • Nacos 2.x版本增加了GRPC服務介面和客戶端,極大的提升了Nacos的性能,本文將簡單介紹grpc-java的使用方式以及Nacos中集成GRPC的方式。 grpc-java GRPC是google開源的、以protobuf作為序列化方式、以http2作為通信協議的高性能rpc框架。 grp ...
一周排行
    -Advertisement-
    Play Games
  • 下麵是一個標準的IDistributedCache用例: public class SomeService(IDistributedCache cache) { public async Task<SomeInformation> GetSomeInformationAsync (string na ...
  • 這個庫提供了在啟動期間實例化已註冊的單例,而不是在首次使用它時實例化。 單例通常在首次使用時創建,這可能會導致響應傳入請求的延遲高於平時。在註冊時創建實例有助於防止第一次Request請求的SLA 以往我們要在註冊的時候實例單例可能會這樣寫: //註冊: services.AddSingleton< ...
  • 最近公司的很多項目都要改單點登錄了,不過大部分都還沒敲定,目前立刻要做的就只有一個比較老的項目 先改一個試試手,主要目標就是最短最快實現功能 首先因為要保留原登錄方式,所以頁面上的改動就是在原來登錄頁面下加一個SSO登錄入口 用超鏈接寫的入口,頁面改造後如下圖: 其中超鏈接的 href="Staff ...
  • Like運算符很好用,特別是它所提供的其中*、?這兩種通配符,在Windows文件系統和各類項目中運用非常廣泛。 但Like運算符僅在VB中支持,在C#中,如何實現呢? 以下是關於LikeString的四種實現方式,其中第四種為Regex正則表達式實現,且在.NET Standard 2.0及以上平... ...
  • 一:背景 1. 講故事 前些天有位朋友找到我,說他們的程式記憶體會偶發性暴漲,自己分析了下是非托管記憶體問題,讓我幫忙看下怎麼回事?哈哈,看到這個dump我還是非常有興趣的,居然還有這種游戲幣自助機類型的程式,下次去大玩家看看他們出幣的機器後端是不是C#寫的?由於dump是linux上的程式,剛好win ...
  • 前言 大家好,我是老馬。很高興遇到你。 我們為 java 開發者實現了 java 版本的 nginx https://github.com/houbb/nginx4j 如果你想知道 servlet 如何處理的,可以參考我的另一個項目: 手寫從零實現簡易版 tomcat minicat 手寫 ngin ...
  • 上一次的介紹,主要圍繞如何統一去捕獲異常,以及為每一種異常添加自己的Mapper實現,並且我們知道,當在ExceptionMapper中返回非200的Response,不支持application/json的響應類型,而是寫死的text/plain類型。 Filter為二方包異常手動捕獲 參考:ht ...
  • 大家好,我是R哥。 今天分享一個爽飛了的面試輔導 case: 這個杭州兄弟空窗期 1 個月+,面試了 6 家公司 0 Offer,不知道問題出在哪,難道是杭州的 IT 崩盤了麽? 報名面試輔導後,經過一個多月的輔導打磨,現在成功入職某上市公司,漲薪 30%+,955 工作制,不咋加班,還不捲。 其他 ...
  • 引入依賴 <!--Freemarker wls--> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.30</version> </dependency> ...
  • 你應如何運行程式 互動式命令模式 開始一個互動式會話 一般是在操作系統命令行下輸入python,且不帶任何參數 系統路徑 如果沒有設置系統的PATH環境變數來包括Python的安裝路徑,可能需要機器上Python可執行文件的完整路徑來代替python 運行的位置:代碼位置 不要輸入的內容:提示符和註 ...