抽奖功能代码快

public int PrizeDraw(List<PrizeModel> source)
{
source = source.Where(_ => _.CouponCount > 0).ToList();
int re = -100;
List<decimal> rateList = new List<decimal>();
decimal all = 0;
// 计算权重分母 权重的分母为每个奖励权重与个数乘积的和
foreach (PrizeModel i in source)
{
all = all + i.Weight * i.SurplusCounts;
}
// 奖励已全部发放完毕 返回-100
if (all == 0)
{
return -200;
}
List<int> indexList = new List<int>();
// 根据权重获取概率(用 权重与个数的乘积 除以分母) 与 index列表(对奖励列表进行乱序时使用)
for (int i = 0; i < source.Count; i++)
{
decimal rate = (source[i].Weight * source[i].SurplusCounts) / all;
rateList.Add(Math.Round(rate, 9));
// Console.WriteLine(rate);
indexList.Add(i);
}
// 获取index列表并进行乱序
Random random = new Random();
List<int> newList = new List<int>();
foreach (int item in indexList)
{
newList.Insert(random.Next(newList.Count), item);
}
// 生成随机数 为保证几率足够小时能够抽得到使用 decimal 类型
decimal multiple = 1000000000;
decimal ramdomKey = rateList.Sum() * multiple;
decimal ramdomNumber = random.Next(0, Convert.ToInt32(ramdomKey)) / multiple;
//// 测试代码 用于展示最大随机数 与生成的随机数
//Console.WriteLine(ramdomKey);
//Console.WriteLine(ramdomNumber);
// 根据乱序的index计算随机数 并获得礼物ID
foreach (int index in newList)
{
if (re == -100)
{
// 每次减一个概率若结果小于0 则为抽到的奖励
ramdomNumber = ramdomNumber - rateList[index];
if (ramdomNumber <= 0)
{
re = source[index].PackageID;
}
}
}
return re;
}

原文地址:https://www.cnblogs.com/yangkangIT/p/14329198.html