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