zoukankan      html  css  js  c++  java
  • 抽奖功能代码快

    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;
    }

  • 相关阅读:
    PHP chgrp() 函数
    PHP basename() 函数
    PHP user_error() 函数
    PHP trigger_error() 函数
    my.cnf需要改的参数
    WPF 使用 Direct2D1 画图入门
    win10 uwp 如何开始写 uwp 程序
    win10 uwp 如何开始写 uwp 程序
    C# 快速释放内存的大数组
    C# 快速释放内存的大数组
  • 原文地址:https://www.cnblogs.com/yangkangIT/p/14329198.html
Copyright © 2011-2022 走看看