根据权重随机出现的结果,两权取其重

字段有相同需要进行分组
function groupByAdvertisementSort(arr) {
	var map = {}, dest = [];
	for (var i = 0; i < arr.length; i++) {
		var ai = arr[i];
		if (!map[ai.sort]) {
			dest.push({
				sort : ai.sort,//重复字段
				top : ai.top,//有利于条件
				data : [ ai ]
			});
			map[ai.sort] = ai;
		} else {
			for (var j = 0; j < dest.length; j++) {
				var dj = dest[j];
				if (dj.sort == ai.sort) {
					dj.data.push(ai);
					break;
				}
			}
		}
	}
	/*for(var j=0;j<dest.length;j++){
		console.log(dest[j]);
	}*/
	return dest;
}

核心随机取值方法

function weight_rand(arr) {
	//参数arr元素必须含有weight属性,参考如下所示  
	//var arr=[{name:'1',weight:1.5},{name:'2',weight:2.5},{name:'3',weight:3.5}];  
	//var arr=[{name:'1',weight:'15%'},{name:'2',weight:'25%'},{name:'3',weight:'35%'}];  
	//求出最大公约数以计算缩小倍数,perMode为百分比模式  
	var per;
	var maxNum = 0;
	var perMode = false;
	//自定义Math求最小公约数方法  
	Math.gcd = function(a, b) {
		var min = Math.min(a, b);
		var max = Math.max(a, b);
		var result = 1;
		if (a === 0 || b === 0) {
			return max;
		}
		for (var i = min; i >= 1; i--) {
			if (min % i === 0 && max % i === 0) {
				result = i;
				break;
			}
		}
		return result;
	};

	//使用clone元素对象拷贝仍然会造成浪费,但是使用权重数组对应关系更省内存  
	var weight_arr = new Array();
	for (i = 0; i < arr.length; i++) {
		if ('undefined' != typeof (arr[i].weight)) {
			if (arr[i].weight.toString().indexOf('%') !== -1) {
				per = Math.floor(arr[i].weight.toString().replace('%', ''));
				perMode = true;
			} else {
				per = Math.floor(arr[i].weight * 100);
			}
		} else {
			per = 0;
		}
		weight_arr[i] = per;
		maxNum = Math.gcd(maxNum, per);
	}
	//数字比模式,3:5:7,其组成[0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2]  
	//百分比模式,元素所占百分比为15%,25%,35%  
	var index = new Array();
	var total = 0;
	var len = 0;
	if (perMode) {
		for (i = 0; i < arr.length; i++) {
			//len表示存储arr下标的数据块长度,已优化至最小整数形式减小索引数组的长度  
			len = weight_arr[i];
			for (j = 0; j < len; j++) {
				//超过100%跳出,后面的舍弃  
				if (total >= 100) {
					break;
				}
				index.push(i);
				total++;
			}
		}
		//使用最后一个元素补齐100%  
		while (total < 100) {
			index.push(arr.length - 1);
			total++;
		}
	} else {
		for (i = 0; i < arr.length; i++) {
			//len表示存储arr下标的数据块长度,已优化至最小整数形式减小索引数组的长度  
			len = weight_arr[i] / maxNum;
			for (j = 0; j < len; j++) {
				index.push(i);
			}
			total += len;
		}
	}
	//随机数值,其值为0-11的整数,数据块根据权重分块  
	var rand = Math.floor(Math.random() * total);
	//console.log(index);  
	return arr[index[rand]].advertId;
}

随机结果方法的封装和调用

function randomWeightByAdvertise(data) {
	var advertObj = data, show = [];
	//获取top==1的结果
	for (var i = 0; i < advertObj.length; i++) {
		if (advertObj[i].top == 1) {
			var randomArr = [];
			for (var j = 0; j < advertObj[i].data.length; j++) {
				var advertise = {
					advertId : advertObj[i].data[j].advertId,
					weight : advertObj[i].data[j].weight
				};

				randomArr.push(advertise);
			}
			show.push(weight_rand(randomArr));
		}
	}
	//获取top==0的结果
	for (var i = 0; i < advertObj.length; i++) {
		if (advertObj[i].top == 0) {
			var randomArr = [];
			for (var j = 0; j < advertObj[i].data.length; j++) {
				var advertise = {
					advertId : advertObj[i].data[j].advertId,
					weight : advertObj[i].data[j].weight
				};
				randomArr.push(advertise);
			}
			show.push(weight_rand(randomArr));
		}
	}
	return show;
}

请求接口获取结果

function getRalationTask() {
	var newShow = [];
	$.getJSON('http://127.0.0.1:8080/hhz-web/article/advertes.html', function(data) {
		var str='',str2='';
		for (var int = 0; int < data.length; int++) {
			str+=data[int].advertId+",";
		}
		console.log(str);
		var advertObj = groupByAdvertisementSort(data);
		var advertArr = randomWeightByAdvertise(advertObj);
		
		for (var int = 0; int < advertArr.length; int++) {
			str2+=advertArr[int]+",";
		}
		console.log(str2);
		
	});
}

具体执行代码

$(document).ready(function() {
	getRalationTask();
});

具体思路参考大神的博客地址https://www.cnblogs.com/xiaodongli/p/5193356.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值