zoukankan      html  css  js  c++  java
  • 抽奖概率算法

            CSI_Riddle riddle = new CSI_Riddle();
            CSI_RiddleAnswer answer = new CSI_RiddleAnswer();
            CSI_Luckdraw luckdraw = new CSI_Luckdraw();
            static Random Rnd = new Random();
            PointLog pointLog = new PointLog();//积分日志

            User user = new User();

            protected void Page_Load(object sender, EventArgs e)
            {
                //Query query = new Query();
                //query.AddAndFilter("AccountId={0}", CurrentAccount.Id);//此表保存的是AccountId
                //user = UserService.Find(query);//总积分表

                int Count = answer.GetCount(" IsTrue=1 and U_ID=" + CurrentAccount.UserId);//答对灯谜数
                int Num = luckdraw.GetCount(" U_ID=" + CurrentAccount.UserId);  //抽奖次数

                Result resul = new Result();
                JavaScriptSerializer jss = new JavaScriptSerializer();

                #region
                if (DateTime.Now >= DateTime.Parse("2014-02-24 12:00:00"))//抽台历
                {
                    //转盘 Turntable
                    List<Prize> Turntable = new List<Prize>{
                            new Prize{ LuckDrowName="0", Chance=25},
                            new Prize{ LuckDrowName="2500", Chance=75}};
                    //是否答对全部所有灯谜,并且台历抽奖开启后是否抽过奖
                    if (answer.GetCount(" IsTrue=1 and U_ID=" + CurrentAccount.UserId) == riddle.GetCount("") && luckdraw.GetCount(" CreateDate>='2014-02-24 12:00:00' and U_ID=" + CurrentAccount.UserId) <= 0)
                    {
                        int TrueCount = luckdraw.GetCount(" Result=0");//中到台历个数
                        if (TrueCount >= 5)//后五个随机
                        {
                            if (TrueCount >= 10)//达到10个后不会抽到台历
                            {
                                resul.Prize = "2500";
                                resul.Angle = AngleNum("2500");

                                luckdraw.Result = 2500;
                                luckdraw.U_ID = CurrentAccount.UserId;
                                luckdraw.CreateDate = DateTime.Now;
                                luckdraw.Add(luckdraw);
                            }
                            else //随机抽五个
                            {

                                resul.Prize = name(Turntable);
                                resul.Angle = AngleNum(resul.Prize);

                                luckdraw.Result = int.Parse(resul.Prize);
                                luckdraw.U_ID = CurrentAccount.UserId;
                                luckdraw.CreateDate = DateTime.Now;
                                luckdraw.Add(luckdraw);
                            }
                        }
                        else //前五个
                        {
                            resul.Prize = "0";
                            resul.Angle = AngleNum("0");//2月24日12点至2月24日23:59

                            luckdraw.Result = 0;
                            luckdraw.U_ID = CurrentAccount.UserId;
                            luckdraw.CreateDate = DateTime.Now;
                            luckdraw.Add(luckdraw);
                        }
                    }

                }
                #endregion
                else
                {
                    if ((Count - Num) > 0)//是否可以抽奖
                    {
                        //转盘 Turntable
                        List<Prize> Turntable = new List<Prize>{
                         new Prize{ LuckDrowName="500", Chance=60},
                         new Prize{ LuckDrowName="1000", Chance=17},
                         new Prize{ LuckDrowName="1500", Chance=17},
                         new Prize{ LuckDrowName="2500", Chance=6}};
                        if (DateTime.Now >= DateTime.Parse("2014-02-24 00:00:00"))
                        {
                            resul.Prize = "-1";//没有抽奖机会
                            resul.Angle = 0;
                        }
                        else
                        {

                            resul.Prize = name(Turntable);
                            resul.Angle = AngleNum(resul.Prize);

                            luckdraw.Result = int.Parse(resul.Prize);
                            luckdraw.U_ID = CurrentAccount.UserId;
                            luckdraw.CreateDate = DateTime.Now;
                            luckdraw.Add(luckdraw);
                        }
                    }
                    else
                    {
                        resul.Prize = "-1";//没有抽奖机会
                        resul.Angle = 0;
                    }
                }
                if (resul.Prize != "-1" && resul.Prize != "0" && resul.Prize!=null)
                {

                    try
                    {
                        pointLog.Point = int.Parse(resul.Prize);//分数
                        pointLog.UserId = CurrentAccount.UserId;
                        pointLog.PointRuleId = 0;//猜灯谜
                        pointLog.RemarkId = 0;
                        pointLog.OperatorId = CurrentAccount.UserId;
                        pointLog.CreateDate = DateTime.Now;
                        PointLogService.Create(pointLog);//加入日志

                        CSI_iknowUser iknowuser = new CSI_iknowUser();
                        object ik = iknowuser.ConvertToModel(iknowuser.GetFieldList(" top 1 *", "AccountId=" + CurrentAccount.UserId).Rows[0]);
                        //iknowuser = iknowuser.ConvertToModel(iknowuser.GetList(" AccountId=" + CurrentAccount.UserId).Tables[0].Rows[0]);
                        //if (iknowuser == null)
                        //{
                        //    iknowuser = iknowuser.ConvertToModel(iknowuser.GetList(" AccountId=" + CurrentAccount.Id).Tables[0].Rows[0]);
                        //}
                        if (ik != null)
                        {
                            iknowuser = (CSI_iknowUser)ik;
                            iknowuser.Point += int.Parse(resul.Prize);
                            iknowuser.Update(iknowuser);//加入总积分
                        }

                    }
                    catch
                    {
                       // luckdraw.DeleteUserID(CurrentAccount.UserId);//删除抽奖
                        resul.Prize = "-2";//出问题了
                        resul.Angle = 0;
                    }
                }

                Response.Write(jss.Serialize(resul));
                Response.End();

            }

            //计算概率
            private Prize LuckDrow(List<Prize> Turntable)
            {
                return (from x in Enumerable.Range(0, 1000000)  //最多支100万次骰子
                        let Prize = Turntable[Rnd.Next(Turntable.Count())]
                        let Sieve = Rnd.Next(0, 100)
                        where Sieve < Prize.Chance
                        select Prize).First();
            }

            //获取中奖奖品名称
            protected string name(List<Prize> Turntable)
            {
                return LuckDrow(Turntable).LuckDrowName;
            }

            //获取转盘的角度
            protected int AngleNum(string LuckDrowName)
            {
                bool flage = true;
                Random rod = new Random();
                int Angle = 0;

                //360度 分成九份  每份40度
                int[,] arrayList = new int[9, 2] { { 0, 39 }, { 40, 79 }, { 80, 119 }, { 120, 159 }, { 160, 199 }, { 200, 239 }, { 240, 279 }, { 280, 319 }, { 320, 359 } };//定义二维数

                switch (LuckDrowName)
                {
                    case "500":
                        while (flage)
                        {
                            Angle = rod.Next(360);
                            if ((arrayList[1, 0] <= Angle && Angle <= arrayList[1, 1]) || (arrayList[3, 0] <= Angle && Angle <= arrayList[3, 1]) || (arrayList[6, 0] <= Angle && Angle <= arrayList[6, 1]) || (arrayList[8, 0] <= Angle && Angle <= arrayList[8, 1]))
                            {
                                flage = false;
                            }
                        }
                        break;
                    case "1000":
                        while (flage)
                        {
                            Angle = rod.Next(360);
                            if (arrayList[7, 0] <= Angle && Angle <= arrayList[7, 1])
                            {
                                flage = false;
                            }
                        }
                        break;
                    case "1500":
                        while (flage)
                        {
                            Angle = rod.Next(360);
                            if (arrayList[0, 0] <= Angle && Angle <= arrayList[0, 1])
                            {
                                flage = false;
                            }
                        }
                        break;
                    case "2500":
                        while (flage)
                        {
                            Angle = rod.Next(360);
                            if (arrayList[2, 0] <= Angle && Angle <= arrayList[2, 1])
                            {
                                flage = false;
                            }
                        }
                        break;
                    default:
                        while (flage)
                        {
                            Angle = rod.Next(360);
                            if ((arrayList[4, 0] <= Angle && Angle <= arrayList[4, 1]) || (arrayList[5, 0] <= Angle && Angle <= arrayList[5, 1]))
                            {
                                flage = false;
                            }
                        }
                        break;
                }
                return Angle;
            }

        }

        public class Prize //奖品
        {
            /// <summary>
            /// 奖品名称
            /// </summary>
            public string LuckDrowName;

            /// <summary>
            /// 概率
            /// </summary>
            public int Chance;
        }

        public class Result //结果
        {
            #region
            private int _angle;
            private string _prize;

            /// <summary>
            /// 角度
            /// </summary>
            public int Angle
            {
                set { _angle = value; }
                get { return _angle; }
            }
            /// <summary>
            /// 奖项
            /// </summary>
            public string Prize
            {
                set { _prize = value; }
                get { return _prize; }
            }
            #endregion Model
        }

  • 相关阅读:
    RHEL6中LVM逻辑卷管理
    Linux配置iSCSI存储
    Linux中FTP服务器配置
    360浏览器兼容模式下IE内核版本
    Ocelot + Consul + Registrator 基于Docker 实现服务发现、服务自动注册
    电视接入系统页面、监控页面
    Registrator中文文档
    关于Skyline沿对象画boundingbox的探讨
    EntityFramework实体默认值遇到Oracle自增主键
    C# 6.0 11个新特性
  • 原文地址:https://www.cnblogs.com/wwy224y/p/3533269.html
Copyright © 2011-2022 走看看