当前位置: 首页 > news >正文

java实现权重随机获取值或对象

文章目录

    • 场景
    • TreeMap.tailMap方法
    • 简单分析
      • 使用随机值
      • 使用treemap实现权重取值
      • 将Int改为Double稍微准确一点,因为double随机的值更加多
      • 测试main方法
    • 当权重的参数比较多,那么建议使用hutool封装的

场景

按照权重2,8给用户分组为A,B,

TreeMap.tailMap方法

treeMap是一种基于红黑树实现的有序映射表,提供了一系列的方法来操作映射表中的元素。其中tailMap方法是用于返回映射表中大于或等于给定键的部分视图。

tailMap方法的定义如下:

   public NavigableMap<K,V> tailMap(K fromKey, boolean inclusive) {return new AscendingSubMap<>(this,false, fromKey, inclusive,true,  null,    true);}

其中,fromKey表示起始键,返回一个从fromKey开始到映射表末尾的部分视图。inclusive是表示是否包含传入的fronKey.这个部分视图是SortedMap类型的,可以进行排序操作。

使用tailMap方法需要注意以下几点:

  1. 如果fromKey不存在于映射表中,则返回的部分视图将包含大于fromKey的所有键值对。
  2. 返回的部分视图是映射表的一个视图,对这个视图所做的修改会影响到原映射表。
  3. 返回的部分视图是有序的,可以进行排序操作。

下面是一个示例代码:

import java.util.TreeMap;
import java.util.SortedMap;public class TreeMapExample {public static void main(String[] args) {TreeMap<Integer, String> treeMap = new TreeMap<>();treeMap.put(1, "one");treeMap.put(2, "two");treeMap.put(3, "three");treeMap.put(4, "four");treeMap.put(5, "five");// 返回大于等于3的部分视图SortedMap<Integer, String> tailMap = treeMap.tailMap(3);System.out.println(tailMap); // 输出 {3=three, 4=four, 5=five}// 修改部分视图tailMap.put(6, "six");System.out.println(treeMap); // 输出 {1=one, 2=two, 3=three, 4=four, 5=five, 6=six}// 对部分视图进行排序SortedMap<Integer, String> sortedTailMap = tailMap.descendingMap();System.out.println(sortedTailMap); // 输出 {6=six, 5=five, 4=four, 3=three}}
}

在上面的示例代码中,首先创建了一个treeMap对象,并向其中添加了5个键值对。然后使用tailMap方法返回了大于等于3的部分视图,并对这个部分视图进行了修改和排序操作。

tailMap方法是Java中treeMap类提供的一个非常有用的方法,可以方便地获取映射表中大于等于指定键的部分视图,并进行排序和修改操作。
针对这个特性可以用来获取权重值

简单分析

好比A:B的权重为2:8,那么相当于A的权重为0->2,B的权重为2->10(2+8)都是包左不包右的;
那我们就可以随机个0-10的值,如果在0->2那么返回A,如果2->10那就返回B

使用随机值

  public static String test1() {Random random = new Random();int i = random.nextInt(10);if (i < 2) {return "A";} else if (i >= 2 && i < 10) {return "B";} else {return "C";}}

使用treemap实现权重取值

   public static String test2() {TreeMap<Integer, String> treeMap = new TreeMap<>();int total = 2 + 8;treeMap.put(2, "A");treeMap.put(total, "B");Random random = new Random();return treeMap.tailMap(random.nextInt(total), false).firstEntry().getValue();}

将Int改为Double稍微准确一点,因为double随机的值更加多

   public static String test3() {TreeMap<Double, String> treeMap = new TreeMap<>();int total = 2 + 8;treeMap.put((double) 2, "A");treeMap.put((double) total, "B");Random random = new Random();return treeMap.tailMap(total * random.nextDouble(), false).firstEntry().getValue();}

测试main方法

package com.study.springbootplus.test;import cn.hutool.core.lang.WeightRandom;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.RandomUtil;import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.TreeMap;/*** @ClassName RandomTest* @Author yida* @Date 2023-09-14 18:26* @Description RandomTest*/
public class RandomTest {public static void main(String[] args) {int num_a = 0, num_b = 0, num_c = 0;int testCount = 1000;for (int i = 0; i < testCount; i++) {switch (test3()) {case "A":num_a = num_a + 1;break;case "B":num_b = num_b + 1;break;case "C":num_c = num_c + 1;break;}}System.out.println("A-" + num_a + "-------" + NumberUtil.div(num_a, testCount, 2) * 100 + "%");System.out.println("B-" + num_b + "-------" + NumberUtil.div(num_b, testCount, 2) * 100 + "%");System.out.println("C-" + num_c + "-------" + NumberUtil.div(num_c, testCount, 2) * 100 + "%");}public static String test1() {Random random = new Random();int i = random.nextInt(10);if (i < 2) {return "A";} else if (i >= 2 && i < 10) {return "B";} else {return "C";}}public static String test2() {TreeMap<Integer, String> treeMap = new TreeMap<>();int total = 2 + 8;treeMap.put(2, "A");treeMap.put(total, "B");Random random = new Random();return treeMap.tailMap(random.nextInt(total), false).firstEntry().getValue();}public static String test3() {TreeMap<Double, String> treeMap = new TreeMap<>();int total = 2 + 8;treeMap.put((double) 2, "A");treeMap.put((double) total, "B");Random random = new Random();return treeMap.tailMap(total * random.nextDouble(), false).firstEntry().getValue();}public static void test() {List<WeightRandom.WeightObj<String>> weightList = new ArrayList<>();weightList.add(new WeightRandom.WeightObj<>("A", 20));weightList.add(new WeightRandom.WeightObj<>("B", 30));weightList.add(new WeightRandom.WeightObj<>("C", 40));weightList.add(new WeightRandom.WeightObj<>("D", 10));WeightRandom<String> wr = RandomUtil.weightRandom(weightList);String str = "";int num_a = 0, num_b = 0, num_c = 0, num_d = 0;int testCount = 10000;for (int i = 0; i < testCount; i++) {str = wr.next();switch (str) {case "A":num_a = num_a + 1;break;case "B":num_b = num_b + 1;break;case "C":num_c = num_c + 1;break;case "D":num_d = num_d + 1;break;}}System.out.println("A-" + num_a + "-------" + NumberUtil.div(num_a, testCount, 2) * 100 + "%");System.out.println("B-" + num_b + "-------" + NumberUtil.div(num_b, testCount, 2) * 100 + "%");System.out.println("C-" + num_c + "-------" + NumberUtil.div(num_c, testCount, 2) * 100 + "%");System.out.println("D-" + num_d + "-------" + NumberUtil.div(num_d, testCount, 2) * 100 + "%");}}

测试结果:
A-195-------20.0%
B-805-------81.0%
C-0-------0.0%
如果测试基数越大,则越准确

当权重的参数比较多,那么建议使用hutool封装的

使用hutool返回权重值 原创

相关文章:

java实现权重随机获取值或对象

文章目录 场景TreeMap.tailMap方法简单分析使用随机值使用treemap实现权重取值将Int改为Double稍微准确一点,因为double随机的值更加多测试main方法 当权重的参数比较多,那么建议使用hutool封装的 场景 按照权重2,8给用户分组为A,B, TreeMap.tailMap方法 treeMap是一种基于红…...

期权账户怎么开通的?佣金最低多少?

场内期权的合约由交易所统一标准化定制&#xff0c;大家面对的同一个合约对应的价格都是一致的&#xff0c;比较公开透明。期权开户当天不能交易的&#xff0c;期权开户需要满足20日日均50万及半年交易经验即可操作。 个人投资者想要交易期权首先就得先开户&#xff0c;根据规…...

MySQL(存储过程,store procedure)——存储过程的前世今生 MySQL存储过程体验 MybatisPlus中使用存储过程

前言 SQL&#xff08;Structured Query Language&#xff09;是一种用于管理关系型数据库的标准化语言&#xff0c;它用于定义、操作和管理数据库中的数据。SQL是一种通用的语言&#xff0c;可以用于多种关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;如MySQ…...

如何建立线上线下相结合的数字化新零售体系?

身处今数字化时代&#xff0c;建立线上线下相结合的数字化新零售体系是企业成功的关键。蚓链数字化营销系统致力于帮助企业实现数字化转型&#xff0c;打通线上线下销售渠道&#xff0c;提升品牌影响力和用户黏性&#xff0c;那么具体是如何建立的&#xff1f; 1. 搭建数字化中…...

python:xlwings 操作 Excel 加入图片

pip install xlwings ; xlwings-0.28.5-cp37-cp37m-win_amd64.whl (1.6 MB) 摘要&#xff1a;Make Excel fly: Interact with Excel from Python and vice versa. Requires: pywin32 编写 xlwings_test.py 如下 # -*- coding: utf-8 -*- """ xlwings 结合 …...

关于hive的时间戳

unix_timestamp&#xff08;&#xff09;和 from_unixtime&#xff08;&#xff09;的2个都是格林威治时间 北京时间 格林威治时间8 from_unixtme 是可以进行自动时区转换的 (4.0新特性) 4.0之前可以通过from_utc_timestamp进行查询 如果时间戳为小数&#xff0c;是秒&#…...

win10 wsl安装步骤

参考&#xff1a; 安装 WSL | Microsoft Learn 一、安装wsl 1.若要查看可通过在线商店下载的可用 Linux 发行版列表&#xff0c;请输入&#xff1a; wsl --list --online 或 wsl -l -o> wsl -l -o 以下是可安装的有效分发的列表。 使用 wsl.exe --install <Distro>…...

深入理解Spring Boot AOP:切面编程的优势与应用

在开发现代化的软件系统中&#xff0c;我们经常会遇到一些横切关注点&#xff08;cross-cutting concerns&#xff09;&#xff0c;比如日志记录、安全控制、事务管理等。传统的面向对象编程&#xff08;OOP&#xff09;在处理这些关注点时往往需要在多个模块中重复编写相似的代…...

使用大模型提效程序员工作

引言 随着人工智能技术的不断发展&#xff0c;大模型在软件开发中的应用越来越广泛。 这些大模型&#xff0c;如GPT、文心一言、讯飞星火、盘古大模型等&#xff0c;可以帮助程序员提高工作效率&#xff0c;加快开发速度&#xff0c;并提供更好的用户体验。 本文将介绍我在实…...

如何应对量化交易,个人股票账户如何实现量化程序化自动交易

目前股票量化交易是对个人账户开放的&#xff0c;如果你没开通&#xff0c;可能是没有找对渠道&#xff0c;很多券商的手机客户端是包含某些简易版的策略交易&#xff0c;如网格策略&#xff0c;自动止盈止损等&#xff0c;这些策略交易虽然简单、灵活性差&#xff0c;但也是量…...

milvus测试

milvus测试 目标 其实&#xff0c;我应该弄明白他的输入输出分别是什么&#xff1f; 输入是图片&#xff0c;图片经过ml模型进行特征提取&#xff0c;再在milvus中进行存储或者检索 部署 ✘ delldell-Precision-3630-Tower  /nvme/baum/git-project/milvus   master …...

antd 表格getCheckboxProps禁用

需求&#xff1a;列表某些数据复选框禁用 实现效果图&#xff1a; 实现代码&#xff1a; <a-table :pagination"false" :row-selection"{ selectedRowKeys: selectedRowKeys, onChange: onSelectChange,getCheckboxProps:getCheckboxProps }" :column…...

京东商品列表数据接口,关键词搜索京东商品数据接口

在网页抓取方面&#xff0c;可以使用 Python、Java 等编程语言编写程序&#xff0c;通过模拟 HTTP 请求&#xff0c;获取京东网站上的商品页面。在数据提取方面&#xff0c;可以使用正则表达式、XPath 等方式从 HTML 代码中提取出有用的信息。值得注意的是&#xff0c;京东网站…...

Vue使用BMapGL,及marker简单使用

1、封装加载器 export function BMapLoader(ak) {return new Promise((resolve, reject) > {if (window.BMapGL) {resolve(window.BMapGL)} else {const script document.createElement(script)script.type text/javascriptscript.src https://api.map.baidu.com/api?v…...

WuThreat身份安全云-TVD每日漏洞情报-2023-10-10

漏洞名称:Glibc ld.so本地权限提升漏洞 漏洞级别:高危 漏洞编号:CVE-2023-4911,CNNVD-202310-197 相关涉及:系统-ubuntu_22.04-glibc-*-Up to-(excluding)-2.35-0ubuntu3.4- 漏洞状态:POC 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-24714 漏洞名称:D-L…...

BSCI认证是谁来验厂?

BSCI认证是BusinessSocialComplianceInitiative的缩写&#xff0c;中文被叫做商业社会标准认证。而BSCI则是倡议商界遵守社会责任的组织&#xff0c;同时它是一个非营利性的组织&#xff0c;宗旨是通过一套统一程序&#xff0c;同时不断完善发展政策&#xff0c;实现监控和促进…...

Java中如何在两个线程间共享数据

Java中如何在两个线程间共享数据 在Java中&#xff0c;在两个线程之间共享数据是常见的需求&#xff0c;但需要小心处理以确保线程安全性。有多种方式可以在两个线程之间共享数据&#xff0c;下面将详细介绍这些方式&#xff0c;以及它们的优缺点。 方式1&#xff1a;共享可变…...

4、在 CentOS 8 系统上安装 pgAdmin 4

pgAdmin 4 是一个开源的数据库管理工具&#xff0c;专门用于管理和操作 PostgreSQL 数据库系统。它提供了一个图形用户界面&#xff08;GUI&#xff09;&#xff0c;使用户能够轻松地连接到 PostgreSQL 数据库实例&#xff0c;执行 SQL 查询&#xff0c;管理数据库对象&#xf…...

【数字人】3、LIA | 使用隐式空间来实现视频驱动单张图数字人生成(ICLR 2022)

文章目录 一、背景二、方法2.1 latent motion representation2.2 latent code driven image animation2.3 学习方式2.4 推理 三、效果3.1 数据集3.2 训练细节3.3 评估3.4 定性效果3.5 定量效果3.6 消融实验3.7 失败示例 论文&#xff1a;Latent Image Animator: Learning to An…...

深度学习基础知识 最近邻插值法、双线性插值法、双三次插值算法

深度学习基础知识 最近邻插值法、双线性插值法、双三次插值算法 1、最近邻插值法 1、最近邻插值法 *最邻近插值&#xff1a;将每个目标像素找到距离它最近的原图像素点&#xff0c;然后将该像素的值直接赋值给目标像素 优点&#xff1a;实现简单&#xff0c;计算速度快缺点&…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

Opencv中的addweighted函数

一.addweighted函数作用 addweighted&#xff08;&#xff09;是OpenCV库中用于图像处理的函数&#xff0c;主要功能是将两个输入图像&#xff08;尺寸和类型相同&#xff09;按照指定的权重进行加权叠加&#xff08;图像融合&#xff09;&#xff0c;并添加一个标量值&#x…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

聊一聊接口测试的意义有哪些?

目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开&#xff0c;首…...

Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信

文章目录 Linux C语言网络编程详细入门教程&#xff1a;如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket&#xff08;服务端和客户端都要&#xff09;2. 绑定本地地址和端口&#x…...

智能AI电话机器人系统的识别能力现状与发展水平

一、引言 随着人工智能技术的飞速发展&#xff0c;AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术&#xff0c;在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

9-Oracle 23 ai Vector Search 特性 知识准备

很多小伙伴是不是参加了 免费认证课程&#xff08;限时至2025/5/15&#xff09; Oracle AI Vector Search 1Z0-184-25考试&#xff0c;都顺利拿到certified了没。 各行各业的AI 大模型的到来&#xff0c;传统的数据库中的SQL还能不能打&#xff0c;结构化和非结构的话数据如何和…...