`
zhangwei_david
  • 浏览: 476065 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

根据权重获取随机值

    博客分类:
  • Java
 
阅读更多

     有一组优惠 A-20优惠, B-30元优惠, C-5元优惠  当用户满足条件时随机返回一个优惠;在活动预算一定的情况下需要保证C类优惠券中奖概率最高,B类优惠券最低;以下是权重的实现;    

    

   

/**
 * Copyright 2014-2015, , Inc. All Rights Reserved.
 * 
 * Date: 2016年1月23日
 */

package org.demo.core;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

/***
 * 
 * Desc:TODO
 * 
 * @author zhangwei<wei.zw@corp.netease.com>
 * @since 2016年1月23日 下午1:35:16
 * @version v 0.1
 */
public class WeightRandomTest {
	private static Map<Double, String> weightMapping = new HashMap<>();

	static {
		weightMapping.put(30d, "A");
		weightMapping.put(20D, "B");
		weightMapping.put(50D, "C");
	}

	public static void main(String[] args) {
		int c = 0;
		int a = 0;
		int b = 0;
		for (int i = 0; i < 2000000; i++) {
			String str = WeightRandomUtil.getWeightRandom(weightMapping);
			if ("A".equals(str)) {
				a++;
			} else if ("B".equals(str)) {
				b++;
			} else if ("C".equals(str)) {
				c++;
			}
		}

		System.out.println(c / 2000000d);
		System.out.println(b / 2000000d);
		System.out.println(a / 2000000d);
	}
}

class WeightRandomUtil {

	/***
	 * 计算权重总和
	 * 
	 * @param weightArrays
	 * @return
	 * @author zhangwei<wei.zw@corp.netease.com>
	 */
	private static double weightSum(Set<Double> weights) {
		double weightSum = 0;
		for (double weightValue : weights) {
			weightSum += weightValue;
		}
		return weightSum;
	}

	/***
	 * 
	 * 
	 * @param weightArrays
	 *            权重数组
	 * @return 返回数据
	 * @author zhangwei<wei.zw@corp.netease.com>
	 * @param <T>
	 */
	public static <T> T getWeightRandom(Map<Double, T> weightValueMapping) {
		double weightSum = weightSum(weightValueMapping.keySet());
		double stepWeightSum = 0;
		List<Double> list = new ArrayList<>(weightValueMapping.keySet());
		Collections.sort(list, new Comparator<Double>() {

			@Override
			public int compare(Double o1, Double o2) {
				return (int) (o2 - o1);
			}

		});
		double r = Math.random();
		for (double weight : list) {
			// 计算权重值
			stepWeightSum += weight;
			// 如果随机数落在了权重区间则返回索引值
			if (r <= stepWeightSum / weightSum) {
				return weightValueMapping.get(weight);
			}
		}
		return null;
	}
}

 

0
0
分享到:
评论

相关推荐

    AHP层次分析法计算权重、特征值、特征向量

    总的来说,AHP层次分析法是一种实用的决策工具,其核心在于权重的计算,而权重的准确获取依赖于判断矩阵的处理和特征值、特征向量的计算。在实际应用中,应确保判断矩阵的一致性和计算过程的精确性,以得到可靠的...

    Java实现按权重随机数

    由于HashMap未在上述示例中使用,但若要进行统计分析,如计算每个权重值出现的频率,HashMap会是一个很好的选择。 总的来说,Java实现按权重随机数涉及对概率的理解以及对数据结构和算法的应用。通过对权重数组的...

    基于自适应权重马尔科夫随机场的立体匹配视差优化算法.docx

    基于自适应权重马尔科夫随机场的立体匹配视差优化算法 立体匹配是计算机视觉领域中的一种技术,通过计算方式获取二维图像对应的视差图,将二维图像信息转变为三维深度信息,从而获取场景的距离信息。立体匹配在智能...

    php实现按照权重随机排序数据的方法

    在某些场景,比如抽奖系统、广告展示或者资源分配等,我们可能需要根据权重进行随机排序。权重决定了每个元素被选取的概率,权重越大,被选中的概率越高。本文将深入探讨如何使用PHP实现这种按权重随机排序的数据...

    ChanceJavaScript的随机生成器助手

    - **概率函数**:`chance.weighted(array, weights)` 可以根据权重返回数组中的一个元素,用于更复杂的概率分布。 7. **其他数据类型** - **颜色**:`chance.color()` 可以生成随机颜色名称或十六进制值。 - **...

    基于随机权重粒子群算法的SCARA机器人动力学参数辨识.pdf

    根据提供的文件内容,本文是一篇关于机器人动力学参数辨识的研究文章,具体内容涵盖了SCARA机器人动力学模型的建立、随机权重粒子群优化算法的开发以及动力学参数辨识的过程。以下是对文章中涉及知识点的详细说明: ...

    Java随机点名源码

    - **映射(Map)**:可能使用`HashMap`来存储姓名与其权重值的对应关系,这样可以在随机选择时快速查找权重值。 5. **用户界面(UI)**: 这个程序可能包含一个图形用户界面(GUI),让用户能够直观地输入姓名和...

    权重剪枝-基于Pytorch实现的算法权重剪枝-算法优化-附项目源码-优质项目实战.zip

    1. **模型训练**:首先,我们需要训练一个基础模型,以获取所有权重的初始值。这通常是通过随机初始化权重,然后在数据集上进行多轮迭代训练完成的。 2. **重要性评估**:接着,对模型的每个权重进行重要性评估。...

    易语言快速取随机字符

    易语言是一种基于中文编程的程序设计语言,...通过理解易语言的字符串和随机数处理,我们可以根据实际需求灵活调整上述代码,以满足各种随机字符生成的需求。这个过程不仅锻炼了编程思维,也加深了对易语言特性的理解。

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

    对于您添加的每个值,几率可以是您想要的 0 到 1 之间的任何值,但在您尝试获取值之前,提供的所有权重的总和必须加起来为 1,以便保证有一个值出现背部。 添加所有权重后,使用 GetNext 方法获取下一个值。

    Matlab实现简单的抽奖程序

    这可以通过调整随机数生成的方式实现,例如,根据权重分配每个参与者的概率值,然后使用`rand`函数的累积分布函数(CDF)版本`randi([0,1],[],'prob')`来生成符合特定概率分布的随机索引。 此外,为了保证公平性,...

    权重计算公式与8种确定权重的方法.pdf

    这篇文章主要介绍了8种不同的权重计算方法,这些方法可以帮助研究人员根据数据特性选择最合适的权重分配方式。 第一类权重计算方法是因子分析和主成分分析,这两种方法都基于信息浓缩的原理,通过解释变量的方差来...

    权重的确定方法借鉴.docx

    权重反映了各个因素在整体评价中的相对重要性,它是一个模糊随机量,具有随机性和模糊性。确定权重的方法多样,包括主观赋权法和客观赋权法。 1. **德尔菲法**: 德尔菲法是一种基于专家意见的权重确定方法,适用...

    电信设备-一种基于互信息的多b值扩散权重图像的降噪方法.zip

    标题中的“电信设备-一种基于互信息的多b值扩散权重图像的降噪方法”揭示了这个压缩包文件内容的核心,主要关注的是电信设备中图像处理的技术,特别是针对噪声的消除。这种技术利用了互信息(Mutual Information, MI...

    高级算法实验--随机算法

    在2.2节中,我们利用随机算法模拟针的落下,通过统计实验数据来逼近π的值。这种方法是蒙特卡罗方法的一个例子,它是一种基于大量随机抽样来求解问题的统计计算方法。 然后,我们来到了排序算法领域,"舍伍德随机...

    MATLAB 成对判断矩阵检验一致性和求权重

    5. **随机一致性指标(RI)**:定义了一个随机一致性指标数组RI,用于一致性检验。这个数组根据矩阵的阶数预先设定。 6. **一致性指标CI计算**:`CI = (Jmax - N) / (N - 1);`计算一致性指标CI。 7. **一致性比率CR...

    php简单计算权重的方法示例【适合抽奖类应用】

    为了实现基于权重的随机选择,我们可以编写一个名为`countWeight`的函数,其工作原理是将每个奖项按照其权重值复制相应数量的次数,然后从这个扩大的数组中随机选择一个元素: ```php function countWeight($data) ...

    根据tensor的名字获取变量的值方式

    在TensorFlow框架中,有时我们需要根据变量的名称来获取其对应的值,特别是在使用预定义的模块(如slim)或处理滑动平均等操作时。这种情况通常发生在系统自动生成了内部变量,而我们并没有直接创建它们。本篇将介绍...

Global site tag (gtag.js) - Google Analytics