1. 程式人生 > >從原始陣列中,隨機新增陣列的值,使得隨機抽取的值符合傳入值

從原始陣列中,隨機新增陣列的值,使得隨機抽取的值符合傳入值

從原始陣列中,隨機新增陣列的值,使得隨機抽取的值符合傳入值
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 // }