从原始数组中,随机添加数组的值,使得随机抽取的值符合传入值
1.随机抽取的概率跟数字大小有关,数组数字越小,抽取的概率越大
2.返回的平均值average接近传入的price_pro 值即可
示例 1:
输入: good_price_list=[1,2,3,4,5,6,7,8,9,10,4,5,6,7,8,10] price_pro = 5
输出:{
good_price_list: [ 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 10, 10, 10 ],
average: 4.953
}
代码
class test{
//获取列表抽取平均数
get_list_average(good_price_list){
var good_price_all = 0;
good_price_list.forEach(e=>{
good_price_all+=1/e;
})
var countAll = {};
for(let i=0;i<5000;i++){
let num = this.genMat({ baseList:good_price_list, baseNum:1/good_price_all })
countAll[num] == null && (countAll[num]=0)
countAll[num]++;
}
var moneyAll=0;
var moneyCountAll = 0;
for(let key in countAll){
moneyAll += countAll[key]*key;
moneyCountAll += countAll[key];
}
return moneyAll/moneyCountAll;
}
genMat({baseList,baseNum}){
var d = Math.random();
var all = 0;
var index = 0;
for(var i=0;i<baseList.length;i++){
var c = (1/baseList[i])*baseNum;
if(d>=all){
index = i
}
all+=c;
}
let genScore = baseList[index];
return genScore;
}
/**
*
* 从一堆数字中,随机抽取, 抽取到的数字平均值为 price_pro
* @param { 原始价格列表 } good_price_list
* @param { 设定随机抽取到的数字平均值 } price_pro
* @param { 函数递归使用,不传 } genGoodP_OBJ
*/
gen_good_price(good_price_list, price_pro, genGoodP_OBJ){
//冒泡排序(小=》大)
good_price_list.sort((a,b)=>{return a-b});
let get_list_average = this.get_list_average(good_price_list);
//偏差值(越小生成越慢)
let offset = 0.05;
if(
( (get_list_average - price_pro < -offset) && (!genGoodP_OBJ || (genGoodP_OBJ && genGoodP_OBJ.direct == 1) ) ) ||
( (get_list_average - price_pro > offset) && (!genGoodP_OBJ || (genGoodP_OBJ && genGoodP_OBJ.direct == -1) ) )
){
if(!genGoodP_OBJ){
genGoodP_OBJ = {}
genGoodP_OBJ.arr = [];
good_price_list.forEach(e=>{
if(get_list_average - price_pro < -offset){
genGoodP_OBJ.direct = 1 ; //偏移方向,变大
if(e > price_pro){
genGoodP_OBJ.arr.push(e);
}
}else if(get_list_average - price_pro > offset){
genGoodP_OBJ.direct = -1 ; //偏移方向,变小
if(e < price_pro){
genGoodP_OBJ.arr.push(e);
}
}
})
genGoodP_OBJ.price_all = 0
genGoodP_OBJ.arr.forEach(e=>{
genGoodP_OBJ.price_all +=1/e;
})
}
let num = this.genMat({ baseList:genGoodP_OBJ.arr, baseNum:1/genGoodP_OBJ.price_all })
good_price_list.push(num);
console.log(`good_price_list.length`,good_price_list.length,'get_list_average',get_list_average)
return this.gen_good_price(good_price_list,price_pro, genGoodP_OBJ);
}else{
return { good_price_list,average: get_list_average }
}
}
}
var a = new test();
var good_price_list = [1,2,3,4,5,6,7,8,9,10,4,5,6,7,8,10];
let gen_pro = a.gen_good_price(good_price_list ,5)
console.log(gen_pro) //返回符合条件的数组good_price_list 和抽取平均数average
// {
// good_price_list: [ 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 8, 8, 8, 8, 9, 10, 10, 10 ],
// average: 4.953
// }