概率计算(抽奖活动、命中率)
2014-05-12 21:22
691 查看
最近在做移动端的营销活动,其中包含刮刮卡、大转盘等小游戏,对于用户来说他们不关心Code只关心我是否中奖了,之前也在群里看到有人要概率的“算法”或者说是计算工具类。
ps:这里不得不提一下,每当自己在做什么东西的时候总会在一些地方发现相似的需求或者文章,来源有很多比如:cnblogs、QQ群等各种渠道,这不刚刚还有人发表随机数相关的文章,哈哈可能是我运气好。
营销活动核心——我是不是中奖了呢?
是不是中奖都有一个概率和巧合性那么肯定少不了随机数了,说到随机数各位Coder们肯定想到了Random这个类,是的这一次的概率计算的实现也是基于随机数的。下面我们来看概率服务接口:
Programinternal class Program { private static void Main() { var random = new Random(); //每一次执行的测试次数(当前为10w次)。 const int totalCount = 100000; //概率百分比。 double probability; #region GetProbability By Console "probability" var promptMessage = "请输入概率百分比,如30%:"; string probabilityString; do { Console.WriteLine(promptMessage); promptMessage = "请输入一个正确的概率百分比:"; probabilityString = Console.ReadLine(); if (probabilityString != null && probabilityString.EndsWith("%")) probabilityString = probabilityString.TrimEnd('%'); } while (!double.TryParse(probabilityString, out probability)); #endregion GetProbability By Console "probability" Console.WriteLine("测试次数设定为:{0},概率设定为:{1}%", totalCount, GetPercentage(probability, 100)); Console.WriteLine("=================================================="); IProbabilityService probabilityService = new ProbabilityService(); while (true) { RunTest(totalCount, (i, hitCount) => probabilityService.IsHit(probability, random.NextDouble)); RunTest(totalCount, (i, hitCount) => probabilityService.IsHit(probability, hitCount, i - hitCount, random.NextDouble)); Console.ReadLine(); } } /// <summary> /// 执行测试。 /// </summary> /// <param name="totalCount">测试次数。</param> /// <param name="hit">是否命中委托。</param> private static void RunTest(int totalCount, Func<int, int, bool> hit) { //总命中次数。 var hitCount = 0; for (var i = 0; i < totalCount; i++) { var isHit = hit(i, hitCount); if (isHit) hitCount++; } //概率百分比。 var percentage = GetPercentage(hitCount, totalCount); Console.WriteLine("总次数:{0},命中次数:{1},概率{2}%", totalCount, hitCount, percentage); } /// <summary> /// 获取百分比。 /// </summary> /// <param name="number1">数字1。</param> /// <param name="number2">数字2。</param> /// <returns>百分比。</returns> private static double GetPercentage(double number1, double number2) { return (number1 / number2) * 100; } }
Demo下载:http://pan.baidu.com/s/1gdmnH31
写在最后
已经写了一些“散文”做为锻炼,之后准备写一个系列挑战一下,不过最近在做项目,等手上的模块做完之后,开始着手针对 Orchard Framework 写一个刨析系列,当然中间可能会穿插一些小文章,喜欢Orchard的朋友们可以留个言留个脚印。相关文章推荐
- 8. 读取输入
- Java领域的IM解决方案
- Spring中@Autowired注解、@Resource注解的区别
- 7. 注释
- 二叉排序树删除值小于value的结点
- vbox修改备份的位置
- log4j详解与实战
- 织梦怎么创建新的内容模型?
- 网站安全个人总结
- 6. 函数
- 高级套接口-(sendmsg和recvmsg)
- 5. 数据类型
- C#.NET程序设计教程实验指导(清华大学 江红,余青松)实验源码第六章
- Linux中的默认权限与隐藏权限(文件、目录)
- php实现从服务器下载文件
- poj3278 Catch That Cow bfs
- 【巩固基础】数据结构——链表的操作:链表的创建和逆序操作
- linux小知识点
- 4. 关键字
- Linux配置防火墙,开启80端口、3306端口