`

加权随机算法的实现

阅读更多
加权随机算法,一般用于抽奖,资源调度等场景,话不多说,上代码:
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%,...

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

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

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

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

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

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

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

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

    扩频通信数字基带信号处理算法及其VLSI实现 PDF

    4. 5 采用CORDIC算法实现DDC 4. 5. 1 CORDIC运算器原理 4. 5. 2 CORDIC的VLSI结构 参考文献 第5章 直接数字频率合成器 5. 1 引言 5. 2 DDFS原理及其性能分析 5. 2. 1 直接数字频率合成器的工作原理 5. 2. 2 DDFS的杂...

    WeightedRandomDistribution:加权随机分布的 ALIAS 方法的实现

    加权随机分布的 ALIAS 方法的 Scala 实现。 加权随机分布允许您从值列表中随机选择一个元素,其中每个值都有指定的权重。 ALIAS 方法是一种在元素选择中实现恒定时间性能的算法。 请参阅以深入了解该主题。 例子 ...

    我用Python写的一些算法

    使用动态规划的两种方式实现的LCS(最大公共串)(下面的算法都会使用动态规划的两种方式来实现) 加权有向无环图中最短路径和最长路径 背包问题 最长回文子串(lps) ###幂乘:算法复杂度是O(lgn) ##贪心算法 活动...

    基于竞争适应重加权采样算法耦合机器学习的土壤含水量估算

    基于竞争适应重加权采样算法筛选出最优光谱变量子集,利用3种机器学习方法——BP神经网络、随机森林回归和极限学习机建立土壤含水量预测模型,进而实现土壤含水量估算模型的优选。结果表明:竞争适应重加权采样算法...

    C/C++,图算法-在无向、未加权和连通图中求最小割的Karger算法

    Karger算法是一种解决最小割问题的随机算法,它是一种近似算法,虽然不是最优解,但具有速度快和实现简单的特点。Karger算法的核心思想是通过随机选择边,逐渐将边缩短,直到两个端点节点重合,形成最小割。在每次...

    鲁棒性时间序列算法Time-Series Processing using Google Earth Engine

    具体来说,鲁棒时间序列平滑算法的实现过程如下: 1. 首先,需要对数据进行预处理,包括选择合适的窗口大小和计算每个数据点的相对权重。窗口大小通常需要根据具体应用场景进行调整,而相对权重则是根据每个数据点...

    论文研究-光滑拼接算法.pdf

    而图像的Gibbs随机场较好地刻画了像素的空间分布,有利于算法去噪,但在保留细节方面较差。该文利用邻域信息,动态地判断像素可能所在的位置,对两种场的权重进行自适应调整,从而实现两种场的优势互补。实验表明,...

    MATLAB智能算法实现(一).pdf

    MATLAB智能算法实现(⼀) MATLAB智能算法实现 (⼀) 写在前⾯:突然想做点⼉什么,为⾃⼰本科四年的学习⽣涯画上⼀个句点。⽤⼀款⾃⼰喜欢的软件实现⼀些⽼师们在上课时总提到的智能算 法应该是⼀件极有意义的事吧...

    粒子群优化算法源码下载

    PSO算法和遗传算法(Genetic Algorithm,GA)类似,也是一种基于迭代的优化工具,系统初始化为一组随机解,通过某种方式迭代寻找最优解。但PSO没有GA的“选择”、“交叉”、“变异”算子,编码方式也比GA简单。并且...

    Python实现BP神经网络算法

    BP 神经网络算法的基本理论和实现步骤: 神经网络架构: BP 神经网络通常由输入层、隐藏层和输出层构成。每个层中有多个神经元,神经元之间通过权重连接。 前向传播: 将输入样本输入到网络中,通过前向传播计算...

    spark ml 算法原理剖析以及具体的源码实现分析

    随机森林 梯度提升树 生存回归 保序回归 聚类 k-means||算法 GMM(高斯混合模型) PIC(快速迭代聚类) LDA(隐式狄利克雷分布) 二分k-means算法 流式k-means算法 最优化算法 梯度下降算法 拟牛顿法 NNLS(非负最小...

    Python和OpenCV 中基于SIFT、单应性、KNN和Ransac的 简单图像拼接算法

    该项目是实现一种基于特征的自动图像拼接算法。当我们输入两个具有重叠字段的图像时,我们期望获得一个宽阔的无缝全景图。 我们使用尺度不变特征变换(SIFT)来提取输入图像的局部特征,使用K个最近邻算法来匹配...

    sdtyusgy.zip_梯度投影算法

    IDW距离反比加权方法,MIMO OFDM matlab仿真,包括随机梯度算法,相对梯度算法,使用matlab实现智能预测控制算法,多元数据分析的主分量分析投影,包含特征值与特征向量的提取、训练样本以及最后的识别。

Global site tag (gtag.js) - Google Analytics