システムの使用;
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);を返します。
}
}
}