根据权重/百分比获取概率值

public int GetAward()
        {
            int result = 0;
          var timeSpanAwardList = new List<Award>();
            var timeList = new List<object>() {};
            timeSpanAwardList.ForEach(t =>
            {
                if (t.DailyQuantity <= 100) //如果每日已发数量>=每日可发数量就排除抽奖列表
                {
                    timeSpanAwardList.Remove(t);
                }
            });
            //当前可参与抽奖的奖品的设置总数
            if (timeSpanAwardList.Count > 0)
            {
                var countRangeList = new List<List<int>>();
                //当前所有奖品总数累加和
                var currentAllTotalCount = 0;
                //计算奖品范围基数值
                foreach (var item in timeSpanAwardList)
                {
                    countRangeList.Add(new List<int>
                    {
                        currentAllTotalCount + 1,
                        currentAllTotalCount + item.TotalQuantity
                    });
                    currentAllTotalCount += item.TotalQuantity;
                }
                //根据百分比重新计算随机基数//这里默认百分比100%
                var baseCount = int.Parse(Math.Ceiling(currentAllTotalCount/(100/100.0)).ToString(CultureInfo.InvariantCulture));
                //以所有奖品总数累加和为上限,1为下限,随机出一位数
                var randomNum = new Random().Next(1, baseCount + 1);
                //奖品序号
                int? awardIndex = null;
                for (var i = 0; i < countRangeList.Count; i++)
                {
                    //判断随机数是否在某个范围基数内,奖品总数范围值越大,中奖几率越高
                    if (countRangeList[i][0] <= randomNum && countRangeList[i][1] >= randomNum)
                    {
                        //如果在范围内,则为奖品序号赋值
                        awardIndex = i;
                        break;
                    }
                }
                if (awardIndex.HasValue)
                {
                    //根据奖品序号取得奖品Id,并获取奖品信息返回
                 result= timeSpanAwardList[awardIndex.Value].Id;

                }
            }
            return result;
        }
public class Award
    {
        public int Id { get; set; }
    /// <summary>
    /// 每日抽中次数
    /// </summary>
        public int DailyQuantity { get; set; }
    /// <summary>
    /// 库存
    /// </summary>
        public int TotalQuantity { get; set; }
   }

  

  

时间: 2024-08-01 13:03:21

根据权重/百分比获取概率值的相关文章

20150218【改进信号量】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进信号量]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 前面我们使用POLL查询方式来实现GPIO-IRQ按键中断程序 这里我们来使用信号量,让我们的驱动同时只能有一个应用程序打开. 一.首先在前面代码的基础上来一个简单的信号 1.定义一个全局的整形变量 2.在打开函数中,每次进入打开函数canopen都自减1, 3.当我们不使用时,在realease 中canopen自加1 4.这样就实现了一个简单的信号量,我们编译,测试 当我们使用两个应用程序来

20150218【改进】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 一.使用struct pin_desc 管理按键的值 1.定义结构体 2.将前面我们申请中断时写的(void *)1修改为 &pins_desc[n] 在ioctl中,设置中断中修改 在key_release中释放中修改 3.在中断程序中利用我们定义的struc pins_desc判断并得到按键的值 4.得到按键键值后,唤醒程序,在read函数中返回键值 附上驱动源程序: 1 /***********

20150218【改进Poll定时查询】IMX257实现GPIO-IRQ中断按键获取键值驱动程序

[改进Poll定时查询]IMX257实现GPIO-IRQ中断按键获取键值驱动程序 2015-02-18 李海沿 按键驱动程序中,如果不使用read函数中使程序休眠的,而是还是使用查询方式的话,可以使用Poll函数,来控制一定时间内,如果有按键发生,则立即返回键值. 同时,poll也可以同时监控多个(比如说按键,鼠标,等)一旦发生事件则立即返回. 我们在linux查看帮助: 从帮助中的说明得知, poll, ppoll - wait for some event on a file descrip

快学Scala 第五课 (构造映射,获取映射值,更新映射值,迭代映射,与Java互操作)

构造映射: val score = Map[String, Int]() val score1 = HashMap[String, Int]() val value1 = Map[String, Int]("aa" -> 1, "bb" -> 2) val value2 = Map[String, Int](("aa", 1), ("bb", 2)) 获取映射值: println(if(value2.contain

工作随笔——Java调用Groovy类的方法、传递参数和获取返回值

接触Groovy也快一年了,一直在尝试怎么将Groovy引用到日常工作中来.最近在做一个功能的时候,花了点时间重新看了下Java怎么调用Groovy的方法.传递参数和获取返回值. 示例Groovy代码如下: # TestGroovy.groovy 定义testC方法,传入3个参数,返回处理后的数据 def testC(int numA, int numB, int numC) { "传入参数:" + numA + numB + numC + "计算之和为:" + (

IE10、火狐浏、谷歌浏览器 KindEditor无法获取textarea值

http://e-mailwu.blog.163.com/blog/static/651040362013311160913/ 在IE10.火狐浏览器.谷歌浏览器下后台KindEditor在线编辑器无法获取textarea值. 解决办法如下: (测试版本号: 4.0.6 (2012-03-18)) 方法一: <link rel="stylesheet" href="WebEditor/themes/default/default.css" /><l

C#配置文件中怎么通过key来获取value值

public static string AppConfig() { return System.IO.Path.Combine(Application.StartupPath, "BlackBoxForms.exe.config"); } /// <summary> /// 根据Key获取Value值 /// </summary> /// <param name="appKey">Key</param> /// &l

TinyOS学习 - 射频层析成像之获取RSSI值

在无线传感网络下,最重要的除了系统就是节点了. 我用的节点是Telosb的节点.然后这个节点下的获取无线的芯片是CC2420 所以我要获取RSSI值的话需要使用它. 先说下获取RSSI值的需求:我在做人的射频层析成像实验,需要追踪人的移动轨迹,而人身上是不戴任何设备的,所以我用这个方法来获取. rssi值是最重要的属性. 第一种:在例子代码里实际上有个例子程序是获取rssi值的,方法是从寄存器内读取,但是这里不适合用来定位,不说了. 第二种:在发送包的时候定义消息包 typedef nx_str

后台数值往前台传值,能获取到值,页面显示不出来的问题

今天遇到一个很头疼的问题,就是后的集合转成json后,网前台传值,可以获取到值,但是页面显示不出来.查了好多的资料都没有得到解决. 查看了资料后发现,ajax少写了一个属性就是dataType:"json"这个属性,这个属性是返回值的格式,这个属性必须要写的.朋友们写代码的时候一定要注意,不要大意. 这些小细节问题很难发现. 1 @RequestMapping("manger") 2 @ResponseBody 3 public String selectAllUs