您的位置:首页 > 其它

概率计算(抽奖活动、命中率)

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的朋友们可以留个言留个脚印。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: