`

加权随机算法的实现

阅读更多
加权随机算法,一般用于抽奖,资源调度等场景,话不多说,上代码:
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author Veiking.cn
 * 加权算法原子对象,具体使用时继承
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Atom {
	/**
	 * 对象标识参数
	 */
	private String id;
	/**
	 * 对象权重参数
	 */
	private int weight;
}

专门剥出来一个基本对象(有效属性是weight,这个属性id都是是为了让看起来更清晰,具体使用的时候拿相应的对象来继承它既可套用算法);
这段各属性本来应该有对应的get、set方法、构造方法,这里边使用了一组lombok的标签,让代码看起来要简练不少,感兴趣的可以百度下,不喜欢的请自行删替;

import java.util.ArrayList;
import java.util.Random;

/**
 * 加权随机算法,获取带有权值的随机元素
 * 用于抽奖,资源调度等场景
 * @author Veiking.cn
 */
public class WeightedRandom {
	
	/**
	 * 获取加权随机对象
	 * @param atomList
	 * @return Atom
	 */
	public static Atom getWeightedRandomAtom(ArrayList<Atom> atomList){
		if(atomList.isEmpty()){
			return null;
		}
		int weightSum = 0;//总权值
		for(Atom atom : atomList){
			weightSum += atom.getWeight();
		}
		//获取总权值之间任意一随机数
		int random = new Random().nextInt(weightSum);  //random in [0, weightSum) 
		//{.},{..},{...},{....}...根据权值概率区间,获得加权随机对象
		for(Atom atom : atomList){
			random -= atom.getWeight();
			if (random < 0) {
                return atom;
            }
		}
		return null;
	}
}

算法实现,原理就是那个注释的大括号,随机数散列到不同比重的区间,获取相应比重的对象;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
/**
 * 测试类
 * @author Veiking.cn
 */
public class WeightedRandomTest {

	public static void main(String[] args) {
		ArrayList<Atom> atomList = new ArrayList<Atom>();
		atomList.add(new Atom("0000001", 10));
		atomList.add(new Atom("0000002", 20));
		atomList.add(new Atom("0000003", 30));
		atomList.add(new Atom("0000004", 40));
		//atomList.add(new Atom("0000005", 50));
		Atom atom;
		atom = WeightedRandom.getWeightedRandomAtom(atomList);
		System.out.println("单个实例:" + atom);
		//累积记录某种对象出现的次数
		Map<String, Integer> countAtom = new HashMap<String, Integer>();
		for (int i = 0; i < 100000; i++) {
			atom = WeightedRandom.getWeightedRandomAtom(atomList);
			if (countAtom.containsKey(atom.getId())) {
				countAtom.put(atom.getId(), countAtom.get(atom.getId()) + 1);
			} else {
				countAtom.put(atom.getId(), 1);
			}
		}
		System.out.println("概率统计:");
		for (String id : countAtom.keySet()) {
			System.out.println(" " + id + " 出现了 " + countAtom.get(id) + " 次");
		}
	}
}

测试类,为了直观体现,把那个比重为50的给注释掉了(这里比重总和没有要求,任意),可以一下看看,效果如下:
单个实例:Atom(id=0000002, weight=20)
概率统计:
 0000004 出现了 39898 次
 0000002 出现了 20191 次
 0000003 出现了 29888 次
 0000001 出现了 10023 次


概率权重这种东西,没有绝对,只有相对。
1
1
分享到:
评论

相关推荐

    python的random模块及加权随机算法的python实现方法

    random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串。 •random.seed(x)改变随机数生成器的种子seed。 一般不必特别去设定seed,Python会自动选择seed。 •random.random() 用于生成一个随机...

    WeightedRandomization:简单加权随机化算法的实现 带使用案例

    WeightedRandomization:简单加权随机化算法的实现 加权随机化是当您想要呈现多个值时,它们之间的几率不同。 例如,考虑值 A、B 和 C。如果您决定需要这 3 个值之一,但您希望 A 出现 20% 的时间,B 40% 和 C 60%,...

    基于Golang实现的加权pagerank算法实现.zip

    总的来说,基于Golang的加权PageRank算法实现可以提供一个高效且可扩展的解决方案,用于处理互联网上的链接数据,评估网页的相对重要性。通过合理的设计和优化,我们可以构建一个能够应对大规模数据的PageRank系统。

    竞争性自适应重加权算法

    标题中的“竞争性自适应重加权算法”(Competitive Adaptive Re-weighted Sampling,简称CARS)是一种在统计学习和机器学习领域广泛应用的数据采样技术。这种算法主要用于高维数据,特别是像近红外光谱(NIR ...

    33473f00b996_加权LeaderRank算法java_复杂网络_

    - LeaderRank算法实现:包括初始化、计算贡献、更新领导力、漂移修正和迭代过程的函数。 - 主程序:读取网络数据,调用LeaderRank算法,输出结果。 在实际应用中,还需要考虑如何处理无权重的边和自环等情况。无...

    论文研究-梯度倒数加权平滑算法的改进与实现.pdf

    处理结果表明, 改进算法较原算法能够更好地去除椒盐和随机噪声, 同时较好地保持了图像的边缘和细节信息, 处理过程的运算复杂度与原算法相当。改进的梯度倒数加权平滑算法为目标识别、图像分割等后继处理与分析提供了...

    Go-pagerank-加权PageRank算法Go实现

    **Go-pagerank-加权PageRank算法Go实现** PageRank是Google早期用于网页排名的一种算法,它通过分析网络中的链接结构来评估网页的重要性。在Go语言中实现加权PageRank算法,可以让我们更好地理解其原理,并在实际...

    用于加权平衡算法的Rust库_rust_代码_下载

    2. **算法实现**:包含随机算法、LVS加权轮询算法和Nginx平滑加权算法的具体实现,可能以函数或者trait的形式存在。 3. **接口设计**:提供一个公共接口,允许用户根据需求选择和使用不同的平衡算法。 4. **测试用例...

    社区划分算法的python3实现, 包括KL算法、 COPAR、Louvain 算法、LFM算法、InfoMap算法等

    COPAR算法结合了随机游走和约束条件,以寻找符合特定属性的社区。它通过计算节点之间的相似性,并考虑到预定义的约束条件,如边的权重或节点属性,来实现社区的划分。 3. Louvain算法: Louvain算法是一种高效且...

    基于向量加权平均值的高效优化算法附Matlab代码.zip

    标题中的“基于向量加权平均值的高效优化算法附Matlab代码”表明这是一个关于使用向量加权平均值方法实现优化算法的Matlab程序。这个压缩包包含了一系列的Matlab脚本和辅助文件,旨在帮助理解并实现该优化算法。 1....

    基于Matlab的加权随机点名提问系统设计.pdf

    该文从教学需求出发,设计一套具有权重的随机点名课堂提问系统,其目的是提高课堂教学质量与学生参与的积极性。该系统具有两个方面的功能,第一,可以避免教师在课堂教学中的带有个人感情色彩的提问偏重,给予每个学生...

    weight_fusion_exp.rar_加权算法_最优加权算法_最优加权融合_权值 融合_权值融合

    加权融合算法的应用广泛,例如在多元线性回归、神经网络、集成学习(如随机森林、梯度提升机)等场景中,都可以看到其身影。 总的来说,这个压缩包提供了一个学习和实践加权融合算法的平台,尤其是关注如何寻找最优...

    一种实现可靠通信的时隙加权平均算法设计.pdf

    本文介绍了随时间变化频率的任意信道的一些估计以及预测方法以及在WCDMA上行链路系统中的应用研究,其中的单时隙加权平均算法和多时票加权平均算法(WMSA)都是经过分析比较得到的。本论文的主要研究工作在于介绍了...

    WeightedRandomization:简单加权随机化算法的实现

    加权随机化简单加权随机化算法的实现加权随机化是当您想要呈现多个值时,它们之间的几率不同。 例如,考虑值 A、B 和 C。如果您决定需要这 3 个值之一,但您希望 A 出现 20% 的时间,B 40% 和 C 60%,那将是加权随机...

    【H5JS】游戏常用算法-路径搜索算法-随机迷宫算法(普里姆算法).pdf

    算法的实现过程涉及随机生成一个迷宫的“骨架”,然后通过普里姆算法来填充骨架内的路径。 在生成迷宫的过程中,首先随机选择一个格子作为当前访问的格子,然后随机选择周围的未访问格子,将它们加入到当前路径中,...

    快速扩展随机树(RRT)算法的实现

    快速扩展随机树(Rapidly-exploring Random ...在实际应用中,根据具体需求,可以对算法进行优化和改进,例如引入增量式搜索、引入加权采样来改善路径质量等。总之,掌握RRT算法及其实现将对你的IT职业生涯大有裨益。

    数据结构经典算法实现

    本压缩包“数据结构经典算法实现”提供了一系列用C语言编写的示例代码,适用于Visual C++或Turbo C编译环境。 1. **数组**:数组是最基本的数据结构之一,它是一系列相同类型元素的集合,通过索引进行访问。在C语言...

    一种基于椒盐噪声图像的加权滤波算法研究 图像滤波算法.pdf

    在算法实现过程中,采用了双阈值策略来处理不同的像素。第一个阈值用于区分噪声点和非噪声点,而第二个阈值则用来决定哪些像素应该被赋予更高的权重以保护边缘信息。这种双阈值的处理方式既保证了噪声的有效去除,又...

Global site tag (gtag.js) - Google Analytics