C#赤いエンベロープ変動係数・高可用性、エンタープライズレベルの開発に最適

システムの使用;
System.Collections.Generic;を使用します。
System.Linqを使用します。
System.Textを使用します。
System.Threading.Tasksを使用します。

名前空間testDemo1
{     /// <summary>     ///赤いエンベロープアルゴリズム、変動率は0-1の間     /// </ summary>     クラスProgram     {




        static void Main(string [] args){             Program p = new Program();             //金額を割り当てるときは、合計金額、配分金額、および最大金額の合理的な計画に注意してください             List <decimal> list = p.createBonusList(500,500、decimal .Parse( "0.01")、10、decimal.Parse( "0.5"));             decimal Count = 0;             foreach(var item in lists)             {                 Count + = item;                 Console.WriteLine(item);             }             Console.WriteLine( "合計:" +カウント);         }










        ランダムra = new Random();

            List <decimal> BonusList = new List <decimal>();             while(sendedNum <totalNum)














            {                 10進数のボーナス= randomBonusWithSpecifyBound(totalBonus、totalNum、sendedBonus、sendedNum、rdMin、rdMax、bigRate);                 ボーナス= Convert.ToDecimal(bonus.ToString( "#0.00"));                 BonusList.Add(bonus);                 sendedNum ++;                 sendedBonus + =ボーナス;             }             bonusListを返します。         }








        /// <summary>
        ///随机分配第n个红包
        /// </ summary>
        /// <param name = "totalBonus"> </ param>
        /// <param name = "totalNum"> </ param>
        /// <param name = "sendedBonus"> </ param>
        /// <param name = "sendedNum"> </ param>
        /// <param name = "rdMin"> </ param>
        /// <param name = "rdMax"> </ param>
        /// <param name = "bigRate">平衡度0-1 </ param>
        /// <returns> </ returns>
        private decimal randomBonusWithSpecifyBound(decimal totalBonus、decimal totalNum、10進数sendedBonus、
        decimal sendedNum、decimal rdMin、decimal rdMax、decimal bigRate)
        {
            decimal avg = totalBonus / totalNum;  // 平均值
            decimal leftLen = avg - rdMin;
            decimal rightLen = rdMax - avg;
            decimal boundMin = 0, boundMax = 0;

            //
            if(leftLen.Equals(rightLen))
            {                 boundMin = Math.Max((totalBonus-sendedBonus-(totalNum-sendedNum-1)* rdMax)、rdMin);                 boundMax = Math.Min((totalBonus -sendedBonus-(totalNum-sendedNum-1)* rdMin)、rdMax);             }             else if(rightLen.CompareTo(leftLen)> 0)             {                 //上限偏差                 10進standardRdMax = avg + leftLen; //右対称上限点                 10進数_rdMax = canReward(bigRate)?rdMax:standardRdMax;                 boundMin = Math.Max((totalBonus-sendedBonus-(totalNum-sendedNum-1)* standardRdMax)、rdMin);









                boundMax = Math.Min((totalBonus-sendedBonus-(totalNum-sendedNum-1)* rdMin)、_rdMax);
            }
            else
            {                 //下限偏离                 10進standardRdMin = avg-rightLen; //左侧対照称下限点                 十進_rdMin = canReward(bigRate)?rdMin:standardRdMin;                 boundMin = Math.Max((totalBonus-sendedBonus-(totalNum-sendedNum-1)* rdMax)、_rdMin);                 boundMax = Math.Min((totalBonus-sendedBonus-(totalNum-sendedNum-1)* standardRdMin)、rdMax);             }





            //平均オフセット修正動的スケール
            if(boundMin.Equals(boundMax))
            {                 return getRandomVal(boundMin、boundMax);             }             decimal currAvg = sendedNum == 0?Avg:(sendedBonus / sendedNum); //現在送信された平均             小数中央=(boundMin + boundMax)/ Convert.ToDecimal(2.0);             decimal subMin = boundMin、subMax = boundMax;             //期待値              decimal exp = avg-(currAvg-avg)* sendedNum /(totalNum-sendedNum) ;             if(middle> exp)             {                 subMax = Math.Round((boundMin + exp)/ Convert.ToDecimal(2.0));             }             else












            {                 subMin = Math.Round((exp + boundMax)/ Convert.ToDecimal(2.0));             }             10進数expBound =(boundMin + boundMax)/ 2;             10進数expSub =(subMin + subMax)/ 2;             decimal subRate =(exp-expBound)/(expSub-expBound);             getRandomValWithSpecifySubRate(boundMin、boundMax、subMin、subMax、subRate);         }







        /// <summary>
        ///下限随机
        /// </ summary>
        /// <param name = "rate"> </ param>
        /// <returns> </ returns>
        private bool canReward(decimal rate)
        {             return Convert.ToDecimal(ra.NextDouble()。ToString())<=率;         }

        / **
         *最小
         値と最大値を含む          min〜max 範囲の乱数を返します* @param min
         * @param max
* @return
         * /
        private decimal getRandomVal(decimal min、decimal max)
        {             decimal v = Convert.ToDecimal(ra。 NextDouble())* max;             v = Convert.ToDecimal(v.ToString( "#0.00"));             return v> = min?V:min;         }



        /// <summary>
        ///確率バイアスのあるランダムアルゴリズム。subMin〜subMax区間の確率バイアスは、boundMin〜boundMax区間(boundMinおよびboundMaxを含む)の乱数を返し、同時にsubMin〜subMaxの優先確率を指定できます。例:パラメータ(10、50、20、30、0.8)に渡し、ランダム結果は、80%の確率で20から30までのランダム戻し、ランダム20%の確率で50 10から返される
        /// </要約>
        // / <param name = "boundMin"> </ param>
        /// <param name = "boundMax"> </ param>
        /// <param name = "subMin"> </ param>
        /// <param name = "subMax"> </ param>
        /// <param name = "subRate"> </ param>
        /// <returns> </ returns>
        プライベート10進数getRandomValWithSpecifySubRate(decimal boundMin、decimal boundMax、decimal subMin、decimal subMax、decimal subRate)
        {             if(canReward(subRate))             {


                getRandomVal(subMin、subMax);
            }
            getRandomVal(boundMin、boundMax);を返します。
        }
    }
}

おすすめ

転載: blog.csdn.net/feng8403000/article/details/104324012