利用权重数抽奖

1.设置奖品类    

public class Prize
    {
        public int id;//奖品id
        public String prize_name;//奖品名称
        public int prize_amount;//奖品(剩余)数量
        public int prize_weight;//奖品权重
                                //getter、setter
    }

2.获取随机数

Random rd = new Random(Guid.NewGuid().GetHashCode());
        public int GetPrizeIndex(List<Prize> prizes)
        {
            int random = -1;
            try
            {
                //计算总权重
                double sumWeight = 0;
                foreach (Prize p in prizes)
                {
                    sumWeight += p.prize_weight;
                }
                //产生随机数
                double randomNumber;
                randomNumber = rd.NextDouble();

                //根据随机数在所有奖品分布的区域并确定所抽奖品
                double d1 = 0;
                double d2 = 0;
                for (int i = 0; i < prizes.Count; i++)
                {
                    d2 += Convert.ToDouble(prizes[i].prize_weight) / sumWeight;
                    if (i == 0)
                    {
                        d1 = 0;
                    }
                    else
                    {
                        d1 += Convert.ToDouble(prizes[i - 1].prize_weight) / sumWeight;
                    }
                    if (randomNumber >= d1 && randomNumber <= d2)
                    {
                        random = i;
                        break;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("生成抽奖随机数出错,出错原因:" + e.Message);
            }
            return random;
        }

 //3.测试


        public void prizeRandom()
        {


            int i = 0;
            PrizeMathRandom a = new PrizeMathRandom();
            int[] result = new int[4];
            List<Prize> prizes = new List<Prize> ();

            Prize p1 = new Prize();
            p1.prize_name="范冰冰海报";
            p1.prize_weight=1;//奖品的权重设置成1
            prizes.Add(p1);
            Prize p2 = new Prize();
            p2.prize_name = "书籍";
            p2.prize_weight = 2;//奖品的权重设置成1
            prizes.Add(p2);

            Prize p3 = new Prize();
            p3.prize_name = "奥迪a9";
            p3.prize_weight = 3;//奖品的权重设置成1
            prizes.Add(p3);

            Prize p4 = new Prize();
            p4.prize_name = "口红";
            p4.prize_weight = 4;//奖品的权重设置成1
            prizes.Add(p4);
            Console.WriteLine("抽奖开始");
            int count = 1000;
            for (i = 1; i <= count; i++)// 打印100个测试概率的准确性
            {
                int selected = GetPrizeIndex(prizes);
                Console.WriteLine("第" + i + "次抽中的奖品为:" + prizes[selected].prize_name);
                result[selected]++;
                Console.WriteLine("--------------------------------");
            }
            Console.WriteLine("抽奖结束");
            Console.WriteLine("每种奖品抽到的数量为:");
            Console.WriteLine("一等奖:" + result[0]+";概率:" + result[0]*1.0/ count);
            Console.WriteLine("二等奖:" + result[1] + ";概率:" + result[1] * 1.0 / count);
            Console.WriteLine("三等奖:" + result[2] + ";概率:" + result[2] * 1.0 / count);
            Console.WriteLine("四等奖:" + result[3] + ";概率:" + result[3] * 1.0 / count);
        }

}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

acycwf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值