Main

January 16, 2017

10 连抽保底的概率模型

网游里有很多抽卡、开箱子之类的赌性玩法,在最开始,游戏设计者实现的时候,仅仅给这些抽取概率简单的设置了一个值。比如抽卡抽出橙卡的概率是 10% ,那么就是说,玩家每次抽一张卡,有 90% 的可能是白卡,10% 的可能是橙卡。

但大 R 玩家是大爷,需要小心伺候。如果感受不好,人跑了就亏大了。概率这个东西靠改进伪随机数发生器是解决不了体验问题的,大爷要是连抽 20 张都出不来橙卡,那是要怒删游戏的。

连抽 20 张 10% 概率橙卡一张都抽不到的机会多不?一张抽不中的概率是 0.9 ,20 张都抽不中的概率是 0.9 ^20 = 12.2% 。这可不算小数字啊。平均 8 个大 R 就会碰到一次,一下子赶跑了 1/8 的金主,这个责任小策划可担当不起。

所以、一般网游都会用各种规则来避免玩家出现连抽不中的尴尬。例如,我忘记是谁发明的 10 连抽规则:如果你购买一个大包连抽 10 次,我在规则上就保证里面一定至少有一张橙卡。实现它应该并不困难,按常规概率生成 10 张的卡包,如果里面没有橙卡,那么我加一张即可。

February 10, 2014

如何让玩家相信游戏是公平的

去赌场参观过的同学应该都见过那种押大小的骰子游戏。庄家投掷三枚骰子,把骰盅盖住,玩家可以押大或小。开盅后,如果发现三个数字之和大于等于 11 就算大,小于等于 10 就算小。如果你猜对了,庄家就 1 赔 1 算给你筹码;否则输掉筹码。另外,还可以以不同赔率压数字,或压三个相同。

为了保障庄家利益,三个相同的数字算不大不小。从概率上讲,这让长时间内庄家必胜。概率分析见这里

如果把这个游戏搬到网络上如何呢?(注意:网上赌博在很多国家是被禁止的,这里只做技术分析而已)

如何让玩家相信庄家没有作弊,真的产生了随机的骰子呢?

December 11, 2011

蒙特霍尔问题与我那餐盒饭

前几天写的盒饭的问题 有很大争议。我并不认为我的结论一定正确,但我想讨论这个问题的人忽略了许多现实的复杂性。

我想说,这是个真实事件,并不是因为我想说明什么问题编的故事。我依然相信,我最后如果做一个交换,会更好一些。不过不想为这个事情争论下去 :)

我觉得这个问题和蒙特霍尔问题有相似之处,但并不相同。我也没想仔细去计算概率,直想快速判断,换或不换哪种得到正确结果的可能性更大。

下面我想向有兴趣讨论说说我上次说的比较含糊的一些条件。毕竟这些条件只有当事人才注意的比较清楚:

December 02, 2011

概率问题

今天起晚了, 到了办公室, 行政mm 出去了, 中饭却已经订好。据说随便帮我订了一份。

几分钟后,快餐送过来,我很纠结我应该拿哪一份吃。只好等其他同学取走。当桌子上还剩下四份的时候,我决定试一下手气,看看能不能拿到我的那一份。

打开检查了一下,发现有三份是相同的,都是牛展,一份是香菇。盘算了一下,我拿走牛展拿对的几率有 75% 。

这个时候蜗牛同学和怪物公司都过来了,居然他们都拿了牛展。这个时候我犯了个错误,没有及时的放下手上的盒饭。果然,几分钟后,PS 同学就在抱怨他的牛展怎么变成香菇了。

我检讨了一下,本来我是有机会修正我的错误的,这其实是一个简单的概率问题:

当有四份快餐的时候,假定另外三人的选择是随机的,三人出现的次序也随机。那么,如果存在一人订的香菇的概率是 75% 。我一开始的选择并没有错。

但是出现了两个取走牛展的同学后就不一样了。假如我的那一份真的是牛展的话,发生这件事的概率只有 1/3 。所以,我的饭是香菇的可能性要更大一些。


这件事上,我的结论是,晚上要早睡,早上早起就可以不麻烦别人帮忙订饭。

April 05, 2009

卡牌中的数学

卡牌对决 封闭内测结束的时候,我们的策划为了奖励第一批玩家,每个帐号送了一张特别的卡,唤作 开天辟地

这个游戏的规则是,每个玩家自选 50 张卡入场,系统洗乱后,每回合每人从自己的卡堆里摸一张出来拿在手上。另外,游戏开始前,每个人先摸 5 张手牌。

除了一些特殊卡外,大部分卡在游戏中用掉就放入弃牌堆。只有等 50 张卡摸完才可以重新洗牌重摸。但开天辟地改变了这个规则,使用后立刻把游戏中每个人的卡重置到开始状态。(弃掉手牌,把所有 50 张重洗重发)

许多新玩家挺痛恨这张卡的(出现后很容易破坏别人的战术,并且可以让自己卡组里的强卡更高频率出现)。更过分的是,有一种叫作“开天党" 的玩家,一拿到 "开天辟地" 就立刻使用。今天 游戏论坛 上有个玩家想计算下,”开天党" 在一局游戏中可能使用开天辟地的次数的数学期望值

我觉得这个问题满有趣,就帮忙计算了一下。

July 10, 2008

闲扯几句

最近事情比较杂,所以没心情写 blog 。

travian 玩了一年多,终于快结束了。奇迹修好就解脱了。这个游戏教了我许多设计思路,并展示了一些问题,需要好好盘点一下。

这两天有人问我,为啥我玩了二十多年电脑,眼睛就不近视呢?这个问题好多人问过了,我也想过好几次,终于有了个结论。就是因为我从小玩电脑,所以才没近视的。

道理其实很简单啊。这么多年,坐在电脑前,干的最多的事情是写程序。这当然不同于大多数非程序员的电脑使用者。非程序员用电脑,需要眼睛需要专注的看屏幕,是屏幕对人体的信息输入。而写程序是个相反的过程,是人体对计算机输入,基本是在用脑而不是用眼。眼睛自然没那么疲劳啦。而正是从小到大坐在显示器前,电视也没怎么看。当然比那些小时候泡在电视前的小孩子们把眼睛保养的好啦。

May 25, 2008

会抽到自己的那张吗?

周末和一个朋友聊天,说是要去阿里巴巴报道了。听说阿里巴巴的入职培训中有个有趣的游戏。所有学员都要在一张纸条上写下自己的一个短期愿望,投进纸箱中。然后大家各抽一张。抽到别人的愿望后,要想办法帮那个人实现愿望,且不能告诉对方是你抽到了他的愿望。

我突然想,如果抽到自己的愿望怎么办?:D

抽到自己的写的那张的概率是 1/n (n 为人数),这个概率和你先抽后抽无关。当人数很多时,概率自然是很小的,但是整个集体中,至少有一个人抽到自己那张的概率看起来却不小。到底是多少呢?我饶有兴趣的算了一下。

April 21, 2008

不那么随机的随机数列

曾经看过这样一种赌徒的策略:假设在一场赌大小的赌博游戏中,赔率是 1:1 ,而庄家不会出千,开大和开小的概率均等(皆为 50%)。赌徒一开始压一块钱,如果他压错了,那么下一次就压两块,再错继续加倍。一旦压对,赌徒永远可以保证有一块钱的进帐。并且从 1 块钱重新开始。

看起来,这种策略能保证永远包赚不赔。但实际上为什么没有人用这个方案发财呢?

放到现实中,试图采用这个策略去赌博的人,几乎都会赔的倾家荡产(当然只要是赌博,差不多都是这个结局)。不要怪运气,不要怪庄家出千,因为这个策略从一开始就注定了失败。

November 25, 2007

随机数有多随机?

作为一个常识,每个程序员在做入门学习时,都会被老师谆谆教导:我们用的编程语言中的随机函数,只能产生出伪随机数。它有它的内在规律,只能作为对显示世界的随机事件的近似模拟。接下来,我们通常会被传授随机种子的概念。以及用物理上更随机的量做种子。比如系统时间、两次敲击键盘的时间间隔、多次移动鼠标的偏移、甚至系统出错的出错信息码等等。

作为游戏数值策划,除了加减乘除,用的最多的数学概念恐怕就是随机数了。有经验的数值策划或许从他的前辈那得知计算机中程序产生的随机数并不太可靠;或者他本身就受过程序方面的训练。如果游戏项目更幸运一点,担当数值策划的他是一个数学爱好者,并读过诸如《计算机程序设计艺术》这样的技术书籍,那么事情会好的多。可惜大多数境遇下,策划们从不深究计算机随机数背后的细节,也不太关心所谓“伪”随机数究竟“伪”到什么程度。

最近几天,有测试人员向我抱怨,我们游戏中某些概率设定总感觉有点怪怪的。似乎跟文档上的不同。

这种抱怨并不少见,许多网络游戏玩家都在抱怨系统生成的随机数不太对劲。善良点的玩家会归咎到自己的 RP 上,阴谋论者则指责系统作弊。运营着的游戏背后,数值策划和程序员们有苦说不出。

有必要科普一些数学常识,也作为我周末读书的一些笔记。

September 30, 2007

洗牌

今天从 svn 中取下一个同事的代码,浏览了一下。其中一段是关于洗牌的。感觉实现的很乱,算法也没有选好。自己重新写了一个。

因为国庆的缘故,负责这块代码的同事提前回家了。我只好自己读代码实现。看完后,发现旧的实现是这样的:对于 N 张牌,每次随机抽出一张来,检查这张牌是否抽过。如果被抽取过,就重复抽取过程,直到不重复。然后记录下抽取的牌的位置。重复这个过程,直到得到一个随机序列。最后用这个序列将原始排列打乱。

这个方案给我的第一感觉并不好,因为当 N 较大时,最后需要重复抽取多次才可以成功。我估算了整个的时间复杂度大约是 O(N^2)

当然,洗牌这件事情可以有许多算法来解决。我重新写了一个,采用了最简单实现的方案。

September 21, 2007

泊松分布

周末,同事离去的都很早。我留在办公室,这周想做的事情基本完成,那就随便写点东西。

写写概率论中非常重要的泊松分布(poisson distribution)是我这周中间就有的想法。

具体的起因记的不太准确了,似乎是因为在一个接收新游戏 bug 反馈的 IM 群里跟同事聊天跑题。从游戏的 bug 扯到游戏的数值设定,然后说起概率,再跑题到大学中学到的数学知识;正好前几天睡觉前在翻《一生受用的公式》这本袖珍小册子,看到了泊松分布的公式以及关于它的有趣的插图;然后问起同事对这个东西的了解程度。

结果可想而知,当时没有人可以准确告诉我到底什么是泊松分布,它有什么用,当然更不用提它的公式是怎么推导出来的了。让我有点自鸣得意的是,自己大概还知道个所以然。不管怎么说,若不是当年本科的概率统计考试中的笔误,我就能拿个满分的。上大学时,考试前我很少复习,不感兴趣的课程也基本没去读书。不是说天才到可以以那种状态考试过关,只是那个时候我不太在意挂科而已 :)。相比较而言,没经过理解的东西让我去背公式应付考试这种事情,我是坚决不干的。

可惟独这本概率统计,我是相当喜欢,也就最认真的去学了。

自己明白不是真的明白,一旦想教给别人时就会露馅。当想把我曾经的理解和记忆写出来时,才发现自己写不太清楚。这几天没事翻了翻书,也 google 了一下,理清了点思路。今天记录下来,算是一个总结。

September 06, 2007

玩了一下 ajax

起因是这样的:

几个同事在棋牌群里聊天,说找不到搭档打桥牌。网上也没啥好地方去,大家都比较讨厌下客户端和注册。我说,不如我做一个免客户端免注册的桥牌网站吧。然后就开始了。

直觉告诉我,ajax 技术可以实现这些。但是我没做过 web 方面的开发,仅有的一些知识只在几年前写过一个 php 留言本。一开始觉得 ajax 这些时髦玩意学一下午,然后一通宵就可以把想要的东西做出来。哪知道,结果不务正业干了半周了,中间还熬了两晚上,到今天都没做完。明天要出差,只好放一放了。

December 22, 2006

菜鸟打桥牌

昨天周四,晚上是固定桥牌时间。

我们公司一小撮人闷头自学打桥牌已经大半年了。就是从网上拉了一本精确叫牌法的手册,胡乱翻了几页,自己瞎打到现在。水平勉强算是已入门的菜鸟吧。

或许什么游戏都是在菜鸟阶段最有乐趣,昨天打了一局牌就相当有趣 :D

我的记忆力已经比刚打牌时好多了,睡了一觉后勉强回忆,终于把当时的情况回想起来。大约是这样的:

                          S XX
                          H K 10 XXX
                          D A 10 8 X
                          C 10 X

S QJ 10 XX                                   S XX
H J X X                                          H Q XX
D X X                                             D J 9 XX
C A X X                                         C K XXX

                         S AK72
                         H AX
                         D K53
                         C QJ9X

June 21, 2006

打成了一次大满贯

我的桥牌生涯实在是太短,所以平生第一次大满贯在昨天晚上才出现。不完全是运气,牌不好叫也不好打。联手牌点其实是不够的,叫牌的时候想了许久才下了决心把 6 加到 7。首攻,明手摊开后又想了很久。但最后毕竟打成了。留文纪念之 :D

June 13, 2006

概率游戏

最近一直在打桥牌,每周2到3次。感觉自己水平提高的比较快。暂时用的精确叫牌,不过好多人打自然,决定过段时间多了解一些叫牌体系。当然,桥牌是个逻辑推理性很强的游戏,各个叫牌体系就算有不同,牌理也是相通的,我想都不难吧。我也不会去参加竞技性质的牌局,不用去刻意人工设计叫牌。

打牌另一个好玩的地方就是很多情况都是要计算概率的。昨天睡觉的时候想到一个问题,很常用,但是一直没有仔细计算过。

当庄家与明手确定有 8 张将牌的时候,对手的 5 张将牌分布的概率。

我大略算了一下,

  • 0-5 分布的概率直观上就知道很少。应该是 (21!/8!) / (26!/13!) * 2 = 3.91%
  • 1-4 分布的概率应该是 (21!/9!) / (26!/13!) *5 *2 = 10.87% (如果有一张 K 在外面,想赌这张 K 是一个单牌,概率只有 2.17% )
  • 那么剩下的 2-3 分布的概率即为 85.2%

当庄家和明手确定 9 张将牌的时候,对手 4 张将牌分布的概率为:

  • 0-4 分布是 9.57%
  • 1-3 分布是 15.3%
  • 2-2 分布是 75.13%

注: 2008 年 5 月 13 日补充:

以上概率计算错了,正确的应该是

4 张时:

3-1 是 49.74% 2-2 是 40.70% 4-0 是 9.57%

5 张时:

3-2 是 67.83% 4-1 是 28.26% 5-0 是 3.91%

最近没时间打牌,以下的概率数据应该根据以上修正,暂时没空改了。


接下来讨论另一个问题,如果联手 8 张将牌,少张 Q 。把 Q 憋死的概率就是:1-4 分布中,Q 为单张的概率为 2.17% 。或者 1-4 分布,且 4 张在对我方有利的位置(这个时候飞牌几乎总可以成功,除非庄家将牌 1-7/0-8 分布,这种情况不多,暂时忽略)的概率是 4.35%,2-3 分布时且 Q 在 2 张这边的概率为 48.9 % , 如果落 Q 落在双张这边,我们在第 2 圈将牌时,将 Q 打下来的几率只有其中的一半,(如果没打下来,一般会优先选择飞牌),所以确保把 Q 打下来的概率是 2.17%+ 4.35% + 48.9%/2 = 30.97% 。一般想让将牌不丢,一般就要飞牌。当 3 张带 Q 在合适飞牌的方位时,联手只要有 10,9 或者 J 都可以选择飞牌,而且很容易飞中。联手保证有 A,K 没有 Q 的前提下,有 J 概率是 60% ; 没有 J 但是有 10,9 的概率是 16.7% (同时,J 必须在 3 张这边才可以飞,这种情况是 50%) ,合计 60%+16.7% * 50% = 68.4% , 3 张在对我方有利的位置的概率是 50% 。 所以,有 34.2% 的概率可以飞中。

综上所述,联手 8 张将牌,少张 Q 时:

  • 保证将牌不输墩的概率为 30.97% + 44.6% * 34.2% = 46.2 % 。

这个概率是在叫牌过程估算用的,当打牌的时候,因为已经知道 J,10,9 的分布情况了。概率就可以重新计算:

  • 有 J 的时候,飞中而不输墩的概率是 30.97% + 44.6% * 50% = 53.3% 。
  • 有 10,9 的时候,飞中而不输墩的是 30.97% + 44.6% * 25% = 42.1% 。
  • 不适合飞牌的时候。也可以赌 1-4 分布,在第2圈将牌中飞一下。因为 1-4 分布的概率很小,若飞不中,可能会丢两个输墩。所以一般在计算时不考虑这个赌博的因素,只能计算为 48.9%*50% + 2.17% = 26.6%

以上计算还不完全正确,主要是有 10,9 缺 Q,J 的飞牌的情况比较复杂,不想算了,应该对结果影响比较小。

当然,因为叫牌的过程可以提供额外的信息,实际的概率估算会对以上结果做一个修正。

April 30, 2006

一个不简单的概率问题

我们办公室里放了四盒扑克,以前是在休息时玩一种扑克游戏用的。这种玩法需要 8 个人进行,同时用 4 副牌。玩完后我们洗乱放进了 4 个牌盒里。现在流行打桥牌,桥牌只用一副 52 张就够了,所以我决定清一副出来。清牌的时候,偷懒不想把 4 个牌盒里的牌全倒出来,然后我脑子里就出现了这么一个问题。

假设牌是完全洗乱,均匀随机分布在 4 个牌盒里的,而且每个盒子里都是均等的 54 张。那么需要打开几个牌盒,才能有很大几率(>90%)的保证从中得到一整副牌呢?

当时一个帮忙清牌的牌友说,大概打开 2 盒就够了。我的直觉告诉我,2 盒应该不够,3 盒应该勉强吧。但实际情况是,我们从 3 盒牌里只找到了独立的 53 张。第 54 张牌是从第 4 个盒子里找到的。

March 28, 2006

桥牌

周末跟同事打桥牌,打满了16局。倒数第2局成绩最为显赫。对方有局,叫到 4S 被 double。最后打宕6墩,拿了 1700 分 :D

有机会打打桥牌还是很有意思的,跟下围棋的感觉大不一样。对同伴的信任和自己的牌技同样重要吧。