抽奖模型

普通概率模型

普通概率模型是最常用的一种模型,但是在游戏运营过程中的确发现很多小白玩家不能正确理解——他们认为中奖率 10% 的设定等同于抽 10 次肯定会中一次。这显然是错误的,普通概率模型的中奖抽奖次数是基于正态分布的,而且每次抽奖的事件是独立的,并不会因为你前面抽了 9 次没中奖,第十次就一定能中奖。

虽然在大量的统计中,两次中奖的平均间隔是 10 次,但是还有一个有趣的数据是连续 10 次都没中奖的概率约为 (1-10%)^10 ~= 34.8% 可不小呢。

此外「标准差」是一个很有意思的数据,经过模拟统计,10% 中奖率得到的标准差为 9.62 ——也就是说绝大分部人经过 10 ± 9.62 次抽奖即能中奖,运气再背抽 20 次也差不多能得到奖励了。

这种概率模型能非常准确地实现策划的需求,但是会惹来一些小白玩家的差评——为什么你说中奖率是 10% 但是我抽了 20 次还没有中奖!然后给你打个一星。所以很多游戏运营商为了顾及玩家的体验,会对普通概率模型进行修订,增设一些保底抽奖次数,例如每第 10 次固定中奖(10,20,30...)

对于这种做法,我暂不于评价。但是让我们看看如果硬生生地加入固定中奖的设定,会给数值带来什么变化吧。

固定中奖模型

每次抽奖中奖率依旧为 10% ,但每第十次抽奖必中。

这时候玩家得到的抽奖体验是:10 次抽奖肯定能中奖,而且不止中一次,爽暴了是不是。实际期望高达 19% 这远远超出策划 10% 的预期。所以策划琢磨着不能便宜了玩家,只能把中奖率调低。但是这会导致中奖集中在每 10 次附近,抽奖的乐趣几近丧失。

这样看来,固定中奖模型是否真的无药可救?其实还是有可以优化的地方。

计数器模型

每次抽奖中奖率依旧为 10% ,若连续 9 次未中奖,下一次抽奖必中奖。

这个需求看起来和上面好像没什么不同,但是保底的条件不再是每第 10 次,而是发生在每连续 9 次未中奖后。也就是说计数器会在每次中奖后清 0 重计。

随机步长累加模型

也是一种保底中奖模型,只不过去掉了独立随机事件,并把计数增长改为随机量,最终在累计超过阈值时得奖。这种模型如果有个较大的阈值和较小的步长下限,还可以起到让玩家在头几次抽奖必然不中(大)奖的效果。另外在这种模型下,计数器甚至可以对玩家可见,让看玩家看到进度和目标,感受到奖励是可达的、近在眼前的。

抽奖算法

/// <summary>
/// 抽奖
/// </summary>
public class Prize
{/// <summary>/// 奖品关键字/// </summary>public string Key { get; set; }/// <summary>/// 权重/数量/// </summary>public int Poll { get; set; }/// <summary>/// 中奖区间/// </summary>class Area{/// <summary>/// 奖品关键字/// </summary>public string Key { get; set; }/// <summary>/// 开始索引位置/// </summary>public int Start { get; set; }/// <summary>/// 截止索引位置/// </summary>public int Over { get; set; }}/// <summary>/// 随机种子/// </summary>static Random Rand = new Random((int)DateTime.Now.Ticks);/// <summary>/// 轮盘抽奖,权重值(在轮盘中占的面积大小)为中奖几率/// </summary>/// <param name="prizeList">礼品列表(如果不是百分百中奖则轮空需要加入到列表里面)</param>/// <returns></returns>public static string Roulette(List<Prize> prizeList){if (prizeList == null || prizeList.Count == 0) return string.Empty;if (prizeList.Any(x => x.Poll < 1)) throw new ArgumentOutOfRangeException("poll权重值不能小于1");if (prizeList.Count == 1) return prizeList[0].Key; //只有一种礼品Int32 total = prizeList.Sum(x => x.Poll); //权重和               if (total > 1000) throw new ArgumentOutOfRangeException("poll权重和不能大于1000"); //数组存储空间的限制。最多一千种奖品(及每种奖品的权重值都是1)List<int> speed = new List<int>(); //随机种子for (int i = 0; i < total; i++) speed.Add(i);int pos = 0;Dictionary<int, string> box = new Dictionary<int, string>();foreach (Prize p in prizeList){for (int c = 0; c < p.Poll; c++) //权重越大所占的面积份数就越多{pos = Prize.Rand.Next(speed.Count); //取随机种子坐标box[speed[pos]] = p.Key; //乱序 礼品放入索引是speed[pos]的箱子里面speed.RemoveAt(pos); //移除已抽取的箱子索引号}}return box[Prize.Rand.Next(total)];}/// <summary>/// 奖盒抽奖,每个参与者对应一个奖盒,多少人参与就有多少奖盒/// </summary>/// <param name="prizeList">礼品列表</param>/// <param name="peopleCount">参与人数</param>/// <returns></returns>public static string LunkyBox(List<Prize> prizeList, int peopleCount){if (prizeList == null || prizeList.Count == 0) return string.Empty;if (prizeList.Any(x => x.Poll < 1)) throw new ArgumentOutOfRangeException("poll礼品数量不能小于1个");if (peopleCount < 1) throw new ArgumentOutOfRangeException("参数人数不能小于1人");if (prizeList.Count == 1 && peopleCount <= prizeList[0].Poll) return prizeList[0].Key; //只有一种礼品且礼品数量大于等于参与人数int pos = 0;List<Area> box = new List<Area>();foreach (Prize p in prizeList){box.Add(new Area() { Key = p.Key, Start = pos, Over = pos + p.Poll }); //把礼品放入奖盒区间pos = pos + p.Poll;}int total = prizeList.Sum(x => x.Poll); //礼品总数int speed = Math.Max(total, peopleCount); //取礼品总数和参数总人数中的最大值pos = Prize.Rand.Next(speed);Area a = box.FirstOrDefault(x => pos >= x.Start && pos < x.Over); //查找索引在奖盒中对应礼品的位置return a == null ? string.Empty : a.Key;}}/*
List<Prize> prizes = new List<Prize>();
prizes.Add(new Prize() { Key = "电脑", Poll = 1 });
prizes.Add(new Prize() { Key = "机柜", Poll = 2 });
prizes.Add(new Prize() { Key = "鼠标", Poll = 3 });string lp1 = Prize.LunkyBox(prizes, 6);
Console.WriteLine(lp1);prizes.Add(new Prize() { Key = "谢谢惠顾", Poll = 5 });
string lp2 = Prize.Roulette(prizes);
Console.WriteLine(lp2);
*/

参考

Return random `list` item by its `weight`

不同概率模型的抽奖体验

抽奖算法

一个简单抽奖算法的实现以及如何预防超中

转载于:https://www.cnblogs.com/HQFZ/p/5945219.html

抽奖算法-指定概率的随机相关推荐

  1. python概率随机抽奖源码_抽奖算法-指定概率的随机

    抽奖模型 普通概率模型 普通概率模型是最常用的一种模型,但是在游戏运营过程中的确发现很多小白玩家不能正确理解--他们认为中奖率 10% 的设定等同于抽 10 次肯定会中一次.这显然是错误的,普通概率模 ...

  2. VBA18随机函数RND例子(抽奖、指定几率、随机凑数)

    一.函数说明(RND.INT.FIX) 官方说明:返回包含伪随机数的 Single . RNG函数属于VBA函数.用法有点类似于工作表的RAND函数 官方语法说明参考: Rnd [ (数字) ] 可选 ...

  3. php 随机几率,php实现根据概率配置随机抽奖

    这是我写的一个比较简单的抽奖算法,并没有很严谨,用于我自己写的wap文字游戏(美味小镇)上的随机食材,可以设定概率值 /** * Created by PhpStorm. * User: tionci ...

  4. Dataset之图片数据增强:设计自动生成汽车车牌图片算法(cv2+PIL)根据随机指定七个字符生成逼真车牌图片数据集(自然场景下+各种噪声效果)可视化

    Dataset之图片数据增强:设计自动生成汽车车牌图片算法(cv2+PIL)根据随机指定七个字符生成逼真车牌图片数据集(自然场景下+各种噪声效果)可视化 导读 设计自动生成汽车车牌图片算法,基于cv2 ...

  5. java实现抽奖游戏_Java实现游戏抽奖算法

    常用抽奖算法对比 基础的游戏抽奖算法通常要求实现在指定奖品的集合中,每个奖品根据对对应概率进行抽取.个人了解的主要有以下几中抽奖算法: 随机数一一对应 算法思想 这种算法思想最为简单.将n个奖品编号0 ...

  6. 红包分配:指定金额指定上下限后随机分发成若干个红包,随机抽

    公司最近策划一个红包活动,指定金额指定上下限后随机分发成若干个红包,以抽奖机制抽给员工.拿到这活,首先想到的当然是度娘哈,偷师学艺之后,初步进行代码实现,下面讲述下原理. 主要分两步:红包随机分割和随 ...

  7. 游戏抽奖网站用java怎么做,Java实现游戏抽奖算法

    常用抽奖算法对比 基础的游戏抽奖算法通常要求实现在指定奖品的集合中,每个奖品根据对对应概率进行抽取.个人了解的主要有以下几中抽奖算法: 随机数一一对应 算法思想 这种算法思想最为简单.将n个奖品编号0 ...

  8. java实现抽奖需求分析_Java开发游戏抽奖算法有哪些?

    Java开发游戏抽奖算法有哪些?抽奖算法根据需求而定,游戏抽奖算法在指定奖品的集合中,每个奖品根据对对应概率进行抽取.Java开发游戏抽奖算法主要有随机数一一对应.离散法Alias算法等. 一.随机数 ...

  9. 转盘抽奖php,使用PHP实现转盘抽奖算法案例解析

    这次给大家带来使用PHP实现转盘抽奖算法案例解析,使用PHP实现转盘抽奖算法的注意事项有哪些,下面就是实战案例,一起来看一下. 流程: 1.拼装奖项数组 2.计算概率 3.返回中奖情况 代码如下: 中 ...

最新文章

  1. Less 命令技巧,从底部网上看
  2. 电脑控制苹果手机_必备神器,电脑控制手机
  3. BootStrap笔记-文本颜色链接颜色背景颜色
  4. ajax 微信code获取_计算机毕业设计中微信小程序实现微信登录(Java后台)
  5. 【Es】es 无法启动 报错 Elasticsearch.init Bootstrap.setup OsProbe NullPointException
  6. 修改本机域名服务器为Google Public DNS或者OpenDNS
  7. pycharm-实用教程和每日练习
  8. 智能优化算法应用:基于麻雀搜索算法与非完全beta函数的自适应图像增强算法 - 附代码
  9. 10分钟掌握运输问题(一)
  10. VS2013编译最简单的PPAPI插件
  11. 苹果电脑装系统只有W ndows,苹果MAC电脑双系统教程——MAC安装Windows双系统教程...
  12. 千帆竞发待东风――乱弹网络游戏广告
  13. Lineage OS15.1 for sagit 编译
  14. Android 集成 google 登录并获取 性别等隐私信息
  15. python快速入门编程第5章编程题
  16. 18 -Flask构建弹幕微电影网站- 部署上线
  17. windows下的中文文件名共享在linux下显示乱码的问题
  18. scanf函数中输入格式及输入基本原理讲解
  19. Unity在商店或者Package Manager下载的Package的保存位置
  20. web网页设计实例作业 ——我的家乡-四川(9页) HTML+CSS+JavaScript 学生DW网页设计作业成品

热门文章

  1. 拥有梦想只是一种智力,实现梦想才是一种能力
  2. 谷歌量子霸权论文;13项NLP任务夺冠的小模型ALBERT
  3. 机器学习实战:k-近邻算法(手写数字识别)
  4. 父类的静态方法能否被子类重写?
  5. 交换器无法根据自身类型和路由键找到符合条件队列时,有哪些处理?
  6. 009_Raphael绘制图形
  7. c语言随机抽奖小程序,小程序抽奖实现
  8. matlab绘制频散曲线,Matlab绘制频散曲线程序代码.docx
  9. python redis集群_Python3 redis集群连接 (带密码验证)
  10. 深入理解 Kotlin Coroutine (一)