抽奖应该都不陌生,常见的双色球、摇号等。本文以简单的根据指定的概率选择奖项为例,简单介绍一下。
首先,看一下大家常见的简单的抽奖。
比如,有两项:中奖和不中奖,中奖概率0.3,不中奖概率0.7。一般都是这样实现的。
public int PrabalityRandom()
{
Random random = new Random();
if (random.Next(1000) > 700)
{
return 1;//表示中奖
}
else
{
return 0;//表示不中奖
}
}
以此为基础,那么当有N个奖项,每项都有指定的中奖概率。如下实现,
有五项,
奖项1,概率:0.01;
奖项2,概率:0.04;
奖项3,概率:0.02;
奖项4,概率:0.03;
不中奖5,概率:0.9;
实现方法:
按概率从小打到排序,然后使用累计概率-当前概率+前一项累计概率。
奖项1,概率:0.01;累积概率:0.01
奖项3,概率:0.02;累积概率:0.03
奖项4,概率:0.03;累积概率:0.06
奖项2,概率:0.04;累积概率:0.1
不中奖5,概率:0.9;累积概率:1.0。
程序:
class Program
{
static void Main(string[] args)
{
List<KeyValuePair<long, double>> elements = new List<KeyValuePair<long, double>>();
elements.Add(new KeyValuePair<long, double>(1, 0.01));
elements.Add(new KeyValuePair<long, double>(2, 0.04));
elements.Add(new KeyValuePair<long, double>(3, 0.02));
elements.Add(new KeyValuePair<long, double>(4, 0.03));
elements.Add(new KeyValuePair<long, double>(5, 0.9));
//概率计算
double allRate = 0;
foreach (var item in elements)
{
allRate += item.Value;
}
if (allRate != 1)
{
Console.WriteLine("奖品概率设置错误!");
Console.WriteLine(allRate);
Console.ReadLine();
return;
}
Random random = new Random();
long selectedElement = 0;
while (true)
{
//连抽20次已查看中奖分布情况,5为不中奖
for (int n = 0; n < 20; n++)
{
double diceRoll = random.NextDouble();
double cumulative = 0.0;
for (int i = 0; i < elements.Count; i++)
{
cumulative += elements[i].Value;
if (diceRoll <= cumulative)
{
selectedElement = elements[i].Key;
break;
}
}
Console.WriteLine(selectedElement);
}
string read = Console.ReadLine();
if (read=="e")
{
break;
}
}
Console.WriteLine(selectedElement);
Console.ReadLine();
}
}
看一组数据:
其实这样的算法,是达不到真正中奖的要求的,原因在与随机数的生成,他的概率是不知道的。这样算出的结果不是原本设定的概率。当然这需要结合概率的相关知识才能实现真正的根据概率得出的中奖结果。待续...
代码:http://download.csdn.net/detail/yysyangyangyangshan/6321281
分享到:
相关推荐
抽奖程序 包含:PPT抽奖代码原理,C#抽奖代码。 大小:8.2M 技术:线程刷新UI,打开音乐, 显示图片,显示GIF,自定义控件,抽奖算法实现。 说明: 1.此算法能实现相对公平的概率,每1000次抽奖测试,分布相对平均,...
1、C#编写的用于公司年会抽奖的程序,可满足基本的抽奖需求; 2、目前设置了一等奖、二等奖、三等奖、幸运奖; 3、支持从txt文件读取人员名单; 4、关闭程序时弹出确认窗口; 5、有背景音乐、抽奖音乐,可根据需求...
升级版本: 1.增加已获奖,不能继续获奖 2.增加多次抽奖 3.删除了自定义控件,保证UI编辑器打开方便 4.规范输出日志
增加Readme PPT 包含算法原理,使用说明,配置说明, 比较公平的抽奖算法,一定程度克服了Random函数...PS:需要自己实现已中奖名单序列化,载入名单后进行去除,就可以避免断电影响,作者比较懒,不再进行相关开发了。
可自定义页面布局,标题、内容等。 编辑奖项、名单,设置抽奖的各种参数。 提供源代码。
用C#编写的抽奖小程序,可以用于公司年会抽奖等
点击开始抽奖,播放抽奖音乐,转到停为止,抽奖音乐关闭,显示中奖的奖品。界面简洁,奖品丰富。很适合新手学习。
简单抽奖程序,读取xml文件到vs中,然后将读取到的xml文档中的数据进行遍历,然后将他们与随机数进行对应,随机到那一个数,哪一个数据就会显示出来
在Main函数中实现打印抽奖菜单的功能:标题“梦幻抽奖”,一等奖“高级轿车”,二等奖“豪华摩托”,三等奖“变速自行车”,鼓励奖“仿真玩具车”,然后等待用户操作,按回车后开始抽奖。
看到很多初学c#的新手队网上复杂的程序都是一筹莫展。所以我写了这样一个极简单的抽奖小程序。为了让新手熟悉c#的用法。
C# 抽奖程序SQL版的制作过程中运用了c#与SQL的接口实现,并能提高c#文件读写的语法
C#写的漂亮的抽奖源代码(可直接在大屏上实用)
一、源码描述 这是一款功能比较实用美观的公司抽奖的源码,功能比较完整, 可以用作学习交流,或者课程设计使用,感兴趣... 该源码主要实现了随机抽奖并且可以查看抽奖结果、抽奖设置、 以及清空抽奖记录的功能。
这是一个使用c#实现简单抽奖程序、只要导入人员excel表、就可以从导入的表中随机抽取中奖人员、并实现中奖结果保存、都是使用了一些很基础的知识、如:三层引用关系、线程、ADO.NET、文件流等、程序比较简单、欢迎...
C#点名程序,也可当作是一个随机摇号或幸运抽奖程序,可以帮助老师在课堂上进行随机点名,实例采用Visual Studio 2008作为开发工具,采用C#开发。为了简单数据存储采用文件的形式。在系统的bin目录下用lottery.asf...
C#学习作品。使用random实现随机抽取(项目包含测试文件读取,配置文件参数读取)
c#实现的抽奖程序,有背景音乐,可以通过修改配置文件实现按比例从奖号中抽奖。
可以实现特等奖,一等奖、二等奖、三等奖的抽奖,设置奖项抽奖次数及每次抽奖个数,可以生成、显示抽奖结果(.txt),可以加载不同背景图片而实现不同公司的使用。可以允许通过手工增加手机号或其它唯一号,也能通过...
VS2010。其中的name.txt记录抽奖姓名列表,程序上循环滚动抽奖人姓名,点击抽奖确定中奖人