2021-08-23 Java取随机数

这次记录主要是因为一个关于概率的需求,大概是要求筛选出A\B\C三个选项,第一次选定A后,下一单再次做筛选的时候,B、C的概率比其余选项筛选时的概率要低。

思路主要基于我们内部的框架去改造,因为原来没有考虑到这一部分,所以原来是直接选中后置选中状态,然后未选择的置回初始状态。现在的想法是根据随机选择的结果多给一个已随机过的状态,然后在随机算法中,给不同状态的数据不同的比重,最后根据累加出来的比重区间出一个数,看这个数落在哪个区间内就选择哪个数据。这里最合适的就是用树结构去做累加。


	主要代码块
	
	private MY_DATA_STRUCTURE randomAL(List<MY_DATA_STRUCTURE> list) {
		TreeMap<Double, MY_DATA_STRUCTURE> map = new TreeMap<>();
		
		for(int i = 0; i < list.size(); i++) {
			MY_DATA_STRUCTURE key = list.get(i);
			double value = 0;
			//分配比重
			if(list.get(i).getStatus() == 0) {
				value = 2.0;
			}else if(list.get(i).getStatus() == 0 {
				value = 1.5;
			}
			
			double lastValue = map.size() == 0 ? 0 : map.lastKey().doubleValue();
			map.put(value + lastValue, key);
		}
		
		//取随机数
		double number = map.lastKey() * Math.random();
		SortedMap<Double, MY_DATA_STRUCTURE> tailMap = map.tailMap(number, false);
		return map.get(tailMap.firstKey());
	}
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值