从原始数组中,随机添加数组的值,使得随机抽取的值符合传入值

从原始数组中,随机添加数组的值,使得随机抽取的值符合传入值
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
//    }

猜你喜欢

转载自blog.csdn.net/weixin_38407447/article/details/84791746