对“赌徒的谬误”的质疑



------
“赌徒的谬误”一文出自《从惊讶到思考——数学悖论奇景》的第二章 概率论悖论。http://www.oursci.org/archive/lib/paradox/paradox.chm

下面是文章的内容:
-------------------------------------------------------------

M:琼斯先生和琼斯太大有五个孩子,都是女儿。
琼斯太大:我希望我们下一个孩子不是女孩。
先生:我亲爱的,在生了五个女儿之后,下一个肯定是儿子。
M:琼斯先生对吗?

M:很多玩轮盘赌的赌徒以为,他们在盘子转过很多红色数字之后,就会落在黑的上,他们就可以赢了。事情将是这样进行的吗?

M:埃德加·阿兰·坡坚持认为,如果你在一轮掷骰子中已掷出五次两点,你下次再掷出两点的机会就要小于1/6了。他说得对不对呢?

M:如果你对任何这类问题回答说“对”,你就陷入了所谓“赌徒的谬误”之中。在掷骰子时,每掷一次都与以前掷出的点数完全无关。

M:琼斯先生和琼斯太太第六个孩子是女孩的概率仍然是1/2。轮盘赌的下一次赌数是红色的概率仍然是1/2。掷骰子时,下一次掷出2的概率仍然是1/6。

M:为了让问题更明朗,假定一个男孩扔硬币,扔了五次国徽向上。这时再扔一次,国徽向上的概率还是完全与以前一样:一半对一半,钱币对于它过去的结果是没有记忆的。


如果事件A的结果影响到事件B,那么就说B是“依赖”于A的。例如,你在明天穿雨衣的概率依赖于明天是否下雨的概率。在日常生活中说的“彼此没有关系”的事件称为“独立”事件。你明天穿雨衣的概率是和美国总统明天早餐吃鸡蛋的概率无关的。

大多数人很难相信一个独立事件的概率由于某种原因会不受临近的同类独立事件的影响。比如,第一次世界大战期间,前线的战士要找新的弹坑藏身。他们确信老的弹坑比较危险,因为他们相信新炮弹命中老弹坑的可能性较大。因为,看起来不可能两个炮弹一个接一个都落在同一点,这样他们就合理地认为新弹坑在一段时间内将会安全一些。

有一个故事讲的是很多年前有一个人坐飞机到处旅行。他担心可能哪一天会有一个旅客带着隐藏的炸弹。于是他就总是在他的公文包中带一枚他自己卸了火药的炸弹。他知道一架飞机上不太可能有某个旅客带着炸弹,他又进一步推论,一架飞机上同时有两个旅客带炸弹是更加不可能的事。事实,他自己带的炸弹不会影响其他旅客携带炸弹的概率,这种想法无非是以为一个硬币扔出的正反面会影响另一个硬币的正反面的另一种形式而已。

所有轮盘赌中最受欢迎的系统是戴伦伯特系统,它正是以赌徒未能认识到独立事件的独立性这一“赌徒谬误”为基础的。参与者赌红色或黑色(或其他任何一个对等赌金的赌),每赌失败一次就加大赌数,每赌赢一次就减少赌数。他们猜想,如果小小的象牙球让他赢了,那么就会有某种原因“记住”它,不太可能让他在下一次再赢;如果小球使他输了,这将感到抱歉,很可能帮助他在下一次赢。

事实是每一次旋转,轮盘都与以前旋的结果无关,这就十分简单地证明了,任何一个赌博系统给赌徒的好处都不会比给赌场主的还多。约翰·斯卡恩在他的“赌博大全”一书中写道:“当你象一般组织好的赌赛中常有的情况,你要因赌场主设赌而给他一定百分比的钱,故你赢的机会就如数学家所说的是负的期望。当你使用一种赌博系统时,你总要赌好多次,而每一次都是“负的期望”。绝无办法把这种负期望加成正的……“

埃德加·阿伦·坡写的骰子的笑话出在他的侦探故事的跋中,题为“玛丽·罗杰特之谜”。一粒骰子,一枚硬币,一个赌盘,或者任何一种随机装置,都会产生一系列独立事件,这些事件无论如何也不会受到这种装置过去状态的影响。如果你们总愿意相信某种赌徒谬误,那么一个有意义的课堂活动就是假装玩一次实际的以赌徒谬误为基础的赌博游戏。比如,一个学生可以反复抛掷硬币,只是在同一面出现三次之后,才与另一学生用扑克牌作筹码打赌。他总是赌硬币相反的那一面。换句话说,就是在三次出现国徽之后,他赌字;在三次出现字之后,他赌国徽。末了,比如说赌了50次,这时他手中的牌数绝不会正好与开始时一样多,但应该是差不多的。也就是说他赌赢赌输的概率是相等的。

-------------------------------------------------------------

我看完此文总觉得事情似乎不应该是这样,所以就花了半小时用 pb 编了个简单的掷硬币程序进行试验,结果是——随着连续出现同一面次数的不同,下一次出现另一面的概率是不同的,而且更为奇妙的是,连续 16 次掷出同一面似乎是不可能的!

连续正面次数 下一次反面概率%
1~5 50
6~7 53
8 52
9 53
10 49
11 54
12 38
13 62~63(波动)
14 33
15 100

------
???????哦。学习了
------
应该是没有关系的
------
Randomize(0)
写了没?
------
关键是,程序呢?
------
概率基本常识...
没有看你的代码,可以肯定的是要么你的代码错了,要么是代码的思路或概念你搞错了
------
太阳绕着地球转曾经不也是常识么?光走直线是常识,但其实它是会拐弯的!

我知道不知所云兄懂得常识并不会永远正确,只是不相信我能发现“真实”罢了。
------
机器程序不能类比全部变化.
一切都不能用简单的科学方法去研究.
一切都是捉摸不定de

我认为一切在特定环境下可知.
但一切都是不可知.
------
浮点运算误差
------
to wcstz0137: 不可知也没关系,当是做游戏了。

to daixf_csdn:我的代码里并没有浮点运算。
------
引用 10 楼 msgtogcr 的回复:
to wcstz0137: 不可知也没关系,当是做游戏了。

to daixf_csdn:我的代码里并没有浮点运算。

------
wcstz0137 兄高抬在下了!没说的,咱们互相学习!
------
mark
------
引用楼主 msgtogcr 的回复:
“赌徒的谬误”一文出自《从惊讶到思考——数学悖论奇景》的第二章 概率论悖论。http://www.oursci.org/archive/lib/paradox/paradox.chm


如果事件A的结果影响到事件B,那么就说B是“依赖”于A的。例如,你在明天穿雨衣的概率依赖于明天是否下雨的概率。在日常生活中说的“彼此没有关系”的事件称为“独立”事件。你明天穿雨衣的概率是和美国总统明天早餐吃鸡蛋的概率无关的。

-------------------------------------------------------------

我看完此文总觉得事情似乎不应该是这样,所以就花了半小时用 pb 编了个简单的掷硬币程序进行试验,结果是——随着连续出现同一面次数的不同,下一次出现另一面的概率是不同的,而且更为奇妙的是,连续 16 次掷出同一面似乎是不可能的!

连续正面次数 下一次反面概率%
1~5          50
6~7          53
8            52
9            53
10          49
11          54
12          38
13          62~63(波动)
14          33
15          100


------
有意思

------
有意思
------
嘿嘿,在赌博中,任何一种赌博的方式,都是可以算出概率的。相对来说,真正能玩的。都不在中国,中国唯一合法的赌博,就是彩票和股票。而彩票。在概率上,是极其的低的。在公正性忽略的情况下。要中?还是很难。所以。这种赌博不好玩。股市就不用说了,跟百家乐差不多了。其他的,去澳门就知道。除了给赌场抽水。概率上还是可以的。也是好玩的
------
楼主所说的“谬误”,是很初级的赌徒才会犯的错误,一般级别高一点的。都不会犯这些毛病。并且他们的数学水平是极高的。
------
学习了....还是没懂!
------
从逻辑上不可能啊
------
感觉楼主是吧一些概念弄混了,独立事件就是没有记忆的和前面已经发生的事件没有关系。如果你要考虑连续多少个正面,这就变成了随机函数的问题了,就不是独立的事件了,硬币的连续正反面,可以用0-1分布的概率函数来算。
------
假设抛掷无缺陷的硬币9次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999999次,每次都是国徽,下次你赌哪一面?

概率是大量数据综合而得的统计平均,但是,到底多少次才算得上是大量呢?临界点在哪里?
------
引用 22 楼 agentianle 的回复:
假设抛掷无缺陷的硬币9次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999999次,每次都是国徽,下次你赌哪一面?

概率是大量数据综合而得的统计平均,但是,到底多少次才算得上是大量呢?临界点在哪里?

------
概率这个东西 在地球上没有人能完全看透。

说多无谓 懂我说什么的自然懂
------
引用 7 楼 msgtogcr 的回复:
太阳绕着地球转曾经不也是常识么?光走直线是常识,但其实它是会拐弯的!

我知道不知所云兄懂得常识并不会永远正确,只是不相信我能发现“真实”罢了。

------
pb中的随机数,并不能体现出“真正”的自然界中那样的随机吧。

Randomize ( n ) 中的这个n一旦确定下来,之后用Rand(n)得到的一系列数字将是固定不变的。

比如,下面的代码:

Randomize( 10 )
long i,j[]
for i = 1 to 20
  j[i] = Rand(2)
next

这段代码不论你什么时候运行,也不管在哪台电脑上运行,得到的j[]中的一系值都是相同的22112111121221212211

假如把上面的种子换成234,则j[]中的一系列数就肯定是:11112122112222212222


------
补充一点,Randomize( n ) 中的n是不能超过32767的,也就是说只有32767个种子,由这些种子产生的Rand(2)序列也就固定只有32767种排列,这些都是PB预设好的而已,根本说明不了什么。

假如甲掷硬币,且已经连续5次正面了。那么对于甲来说,下一次出正面的几率应该是很低很低。

此时,乙路过,乙根本不知道甲前面已经5次正面,乙如果猜甲下一次正面还是反面,对于乙来说正反面的机率都应该是50%吧。


------
计算机中的随机数产生算法一般来说都是“伪随机”,就是不是真正的随机数。用这样的数字来模拟自然界中的随机事件不能得到很精确的结果。

另外,如果甲掷硬币,无论他已经连续5次、50次、500次得到正面了,从数学上来说下一次出现正面的概率还是0.5,硬币是没有记忆的。不过事实上,如果甲真的连续多次得到正面,我们有理由期待下一次还是正面的概率 > 0.5,因为这很有可能那个硬币并不均匀或甲在以一种特殊的手法来掷硬币。
------
多谢楼主 学习了。 很佩服楼主,粗略的看了下代码,逻辑应该是对的。先收藏 等待各路高手给答案
------
LZ是理解错误了,别人是说上一次对下一次的影响,而不是说连续的概率.
说的明白点,后次和前次是没关的,他连生八个女儿,第九次生女儿的机会还是二分之一,按LZ来说说是2(9之一,但是事实是二分之一
------
当然你要说连生九个女儿的概率是多少,那就是你想的那样,而别人是说下一次是儿子还是女儿,你说他的概率是多少,男的Y染色体可不会变少
------
刚自己随便写了个程序测试了下,结果是
正面概率:53
反面概率:47
代码如下:请指教。
public int randomtest()
{
//0正面 1反面
boolean isR=false;//前几次是否连续
int times=1;
int right;//第一次抛出面
while(times<15){
int n= (int)(Math.random()*2);
right=n;//以后连续都要这个面
if(n==0){
times++;
// if(times==5){
// System.out.println("联系15次:"+n);
// }
}else{
times=0;
}
}
int n= (int)(Math.random()*2);
return n;
}

public void randomtest1(){
int a=0;//正面
int b=0;//反面
for(int i=0;i<100;i++){
if(randomtest()==0){
a++;
}else{
b++;
}
}
System.out.println("正面概率:"+a);
System.out.println("反面概率:"+b);

}
------
呃 这不是老师在高中时候教的吗?
------
学习
------
这理论好复杂啊。不过我也用不到它,我在翻译公司做网站。平时用不到这么复杂的理论
------
引用 19 楼 tdl66 的回复:
学习了....还是没懂!

------
mark
------
学习..顶一个

------
to Sephoenix:超大是多大呢?我给出的概率基本上都是让电脑模拟 1 亿次之后的结果,需要的话,我的程序可以模拟 42 亿次以上(只有连续 6 次的那个概率因为模拟的次数较少算错了,其实应该是 51%)。我认为每次掷硬币的结果与上一次都是有关系的,而且不仅仅是上一次,而是与以前的每一次都有关!但我认为如何并不重要,我只是想知道为什么电脑的模拟结果与数学理论不符?

to leio 和 oldjwu:如你们所说,只要种子确定,产生的结果就是确定的,这是一种“伪随机”;但随机现象仍然是可以模拟的,真伪的区别只在于产生的方法,而不在于产生的结果!

以下内容摘自百度百科:
伪随机序列  如果一个序列,一方面它是可以预先确定的,并且是可以重复地生产和复制的;一方面它又具有某种随机序列的随机特性(即统计特性),我们便称这种序列为伪随机序列。因此可以说,伪随机序列是具有某种随机特性的确定的序列。它们是由移位寄存器产生确定序列,然而他们却具有某种随机序列的随机特性。因为同样具有随机特性,无法从一个已经产生的序列的特性中判断是真随机序列还是伪随机序列,只能根据序列的产生办法来判断。伪随机序列系列具有良好的随机性和接近于白噪声的相关函数,并且有预先的可确定性和可重复性。

to yaoho_11:很高兴你能写代码进行验证!不过好像有点问题:当 timers 初始化为 1 时,while(times <15){ 在连续 14 次出现正面后应该就会退出;另外,100 次循环似乎少了点啊。
------
学习
------
引用 22 楼 agentianle 的回复:
假设抛掷无缺陷的硬币9次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999999次,每次都是国徽,下次你赌哪一面?

概率是大量数据综合而得的统计平均,但是,到底多少次才算得上是大量呢?临界点在哪里?

------
生8胎女儿的概率与生9胎女儿的概率的区别? 两者的概率都极其小
对于生了8胎女儿后下一胎是男是女的概率? 我想还应该是50%


你没模拟出16次同一面,不代表就真的没有。我可是在色子中看过连出20个大的!


------
概率常识.
每次投硬币得到正面的概率是1/2.
连续投16次都得到正面的概率是(1/2)的16次方,即0.0000152587890625.
------
补充一点.
如果连续5胎是女,那第6胎是男的概率?
从单次事件看,依然是1/2.
从连续6胎的整体事件看,第6胎是男或者是女的概率也是相等的,都是(1/2)的6次方.

这里当然没考虑生物学本身了~~
------
这个问题非常的实用
在需要强化装备的游戏中
往往有很多人在强化垃圾装备失败以后,再强化极品装备,认为这样会加大成功概率
你们觉得呢~~~
------
哈哈,进来看看。
------
简单的说,计算机中所谓的随机不过是模拟出的结果
------
唉。高中时候就该搞明白的问题。

很多次是相同结果当然是可能的,只是概率低一点而已。

计算机程序里的随机数不是真的随机数,而是根据一些计算得出来的伪随机数,java默认会参照时间之类会变化的数值来生成。

这种情况下出来的结果做不得准的。
------
引用 41 楼 sephoenix 的回复:
引用 22 楼 agentianle 的回复:
假设抛掷无缺陷的硬币9次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999999次,每次都是国徽,下次你赌哪一面?

概率是大量数据综合而得的统计平均,但是,到底多少次才算得上是大量呢?临界点在哪里?

我赌你作弊……
或者根本就是两面都是国徽的假币……

------
UP
------
大多数人很难相信一个独立事件的概率由于某种原因会不受临近的同类独立事件的影响。比如,第一次世界大战期间,前线的战士要找新的弹坑藏身。他们确信老的弹坑比较危险,因为他们相信新炮弹命中老弹坑的可能性较大。因为,看起来不可能两个炮弹一个接一个都落在同一点,这样他们就合理地认为新弹坑在一段时间内将会安全一些。 

——在不移动、以及炮弹无大差距的情况下,由于火炮动能较大风力等因素对炮弹落点影响较小。此外,炮弹做为军工产品,质量还是比较统一的。所以军事上要塞守卫时,有将阵地划分为等面积的方格,然后火炮预射确认对应的格子,正式开战后可以进行范围内的精确打击。
  哎,似乎弹坑都不安全,还是选个着弹点比较少的自然落差区域卧倒比较好。
------
引用 41 楼 sephoenix 的回复:
引用 22 楼 agentianle 的回复:
假设抛掷无缺陷的硬币9次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币9999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币99999999次,每次都是国徽,下次你赌哪一面?
假设抛掷无缺陷的硬币999999999次,每次都是国徽,下次你赌哪一面?

概率是大量数据综合而得的统计平均,但是,到底多少次才算得上是大量呢?临界点在哪里?

我赌你作弊……
或者根本就是两面都是国徽的假币……

------
PS:数学不能解决一切问题,但是可以分析一切问题
现实的结果永远是理论的子集
------
每天回帖即可获得10分可用分!小技巧:教您如何更快获得
------
引用 45 楼 oktsl 的回复:
这个问题非常的实用
在需要强化装备的游戏中
往往有很多人在强化垃圾装备失败以后,再强化极品装备,认为这样会加大成功概率
你们觉得呢~~~

------
引用 7 楼 msgtogcr 的回复:
太阳绕着地球转曾经不也是常识么?光走直线是常识,但其实它是会拐弯的!

我知道不知所云兄懂得常识并不会永远正确,只是不相信我能发现“真实”罢了。

------
LZ 你要把连续16次是正面的概率 和 连续15次正面 下一次还是正面的概率 区分开 OK?

看了楼主39的回复 我知道楼主哪里思考错了 哈哈!
------
一个独立事件也引发这么多的说法,O(∩_∩)O~,看评论看的很晕了。
------
堪称“技术流彩民”的一个重磅炸弹。鬼知道彩票中奖的概率和技术分析无关。
所以,~~~ 还是机选吧。
------
帮顶吧,顶到火星上的概率是多少呢......
------
他不会拐弯 他拐弯是受外力了
此句语义前后矛盾。

请问你 那连续出现同一面次数的概率确定吗? 你把实验建立在一个不确定的事务上你要找确定的概率?????你认为你能找到吗?
在抛掷次数确定的前提下,我认为是确定的,所以我认为我能找到,但这并不重要;我只想知道我的试验结果为什么与书上的不一样,是我的代码有问题?还是 pb 的随机算法有问题?

1.请问第16次与第1-15次有什么关系????
不知道,但我认为有关系,所以才有后面的试验。再次强调,我认为如何丝毫不影响我的试验,这是互相独立的事件。我的试验就是在模拟一个东西在掷硬币而已,如果你认为我的“错误认识”影响到了试验程序的设计,那么,请指出试验本身的错误之处。(或者,你认为理论只需要用数学方法证明正确了即为正确,至于实际中情况如何是不用管的,那我就没什么好说了)

请问不管你连续了多少次 你这次扔的结果有几种?(答案 哪怕你前面连续了10000次 或者哪怕你还没扔呢 你现在的结果只有2中[当然你扔沙堆直立了就当我没说什么] 一种就是正面一种就是反面 所以说下次正反面的概率永远都是50% 与你的程序无关 与你的思路无关 与你的怀疑猜测更无关 )
如果你认为“下次反面概率永远都是50%”的说法与我的试验结果没有矛盾的话......我就没什么好说了

------
任何科学都有片面性,惟独纯数学是完美的.
纯数学的真理是经过严格证明的,你要推翻必须拿出一个令人信服的证明过程.
试验具有局限性,所以最多你只能持怀疑态度.

其实如果连续投郑100,000次硬币, 连续出现16面正面的概率,数学上是可以计算的,不过这是令人头疼的计算题,不过我相信你计算出来以后会有所启发.
如果嫌100,000太大,你可以改为100,甚至20,当然下限是16.
------
楼上的意思我理解,但我想知道问题出在什么地方。今天在网上找到一篇文章,基本上解决了我的疑云!

随机数有多随机?http://blog.codingnow.com/2007/11/random.html

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

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

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

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

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

鉴于我所接触过的多数游戏策划大多没有很高的数学素养(这里用于对比的参照物——我自己,在数学方面的修养已经够差了),下面不列公式,只列常识。如果涉及一些数学上的结论,也回避证明过程。

以扔硬币为例来看概率:

如果硬币本身没有问题,那么每次实验的结果,正面和反面的出现概率理应一致,都是 50% 。

btw ,如果碰巧连丢了 10 次都是正面的话,认为第 11 次出现反面的概率更高的读者可以不必看下去了。根据基本的概率理论,作为独立实验,相互间是不会造成概率影响的。无论前面出现多少次正面,下一次正面的概率依旧是 50% ,不会多也不会少。当然,如果是现实中出现这种情况,我会认为是道具本身出了问题,或许这个硬币两面都是正面。这样的话,第 11 次倒是极有可能再次出现正面。

对独立的随机事件的单次预测做不到准确,但却可以从统计上得到一个稳定的数值。我们知道,大量做丢硬币的实验 n 次。随着 n 的增大,出现正面和反面的次数会趋与一致。

OK ,以上都是作为一个游戏数值策划应该具有的常识。只是人们往往忽略了一点:若是正面和反面在多次实验中出现次数严格一致的话,又反过来是一件小概率事件。例如:丢一万次硬币,正好出现 5000 次正面的概率大概不会比你买彩票中个小奖的概率高多少。


--------------------------------------------------------------------------------

补充:

在 10000 次一组的丢硬币的实验中,正好出现 5000 次正面的概率依旧是比所以其它情况概率更大一些的。其它情况可能是 10000 次 …… 5001 次、4999 次、4998 次 …… 甚至零次正面。

正好出现 5000 次正面有最大的可能性,但是绝对概率却不大(也不算太小)。

前段时间写过一篇 blog 谈到了用交换法洗牌 ,那篇文章中提及的一篇论文的结论谈到:

“当 N 大于等于 18 时,用这个方法洗牌后,居然恒等排列(identity permutation)是最有可能出现的。(所谓恒等排列大概是指第 n 张排在第 n 个位置)”

这句话很容易被人误解。概率最大并不等于很容易出现,正如 10000 次丢硬币刚好出现 5000 次正面不易出现一样。


--------------------------------------------------------------------------------

如何看一个均匀分布的随机数发生器产生的数值到底随机不随机,简单的用统计产生出来的数字的分布是否接近均等是远远不够的。接下来介绍一下统计学中最著名的 χ 方检验。

假设我们投一个六面骰。每次 1 ~ 6 的点数出现的概率均为 1/6 。如果用计算机来模拟它,采用函数 random (1,6) 来产生一个 1 到 6 之间的随机整数。怎样判断产生的数字够不够随机呢?

我们可以投 n 次(n 很大,比如 n=10000 ),统计出每个点数出现的次数:Y1,Y2,Y3,Y4,Y5,Y6 。理想的次数则都应该接近于 p=n/6 次。

取 V=(Y1 - p)^2 / n + (Y2 - p)^2 / n + (Y3 - p)^2 / n + (Y4 - p)^2 / n + (Y5 - p)^2 / n + (Y6 - p)^2 / n

划简后 V=6/n * ( Y1 到 Y6 的平方和) - n 

这个 V 即量化表示了这 n 次实验反应出来的数字随机性。当 V 过大时,骰子可能偏向某几个特定点数更多一些。而 V 过小的话,则可能是随机数发生器有一些明显的规律(事实上,所有伪随机数产生算法都是一定有规律的)。

我们现在需要知道的是,对于一个随机数列,什么样的 V 是比较合理的。对于用随机数做骰子的实验,V 的值也是随机的,当然不是均匀分布。实际上它符合 χ 方分布。如果我们投骰子用的随机数是真正的均匀分布的话,V 值出现特别小或特别大的概率都很小。

实际上,在这个六面骰的例子中,V 有 1% 的可能小于 0.5543 ,有 5% 的可能小于 1.1455 ,有 25% 的可能小于 2.675 ,有 50% 的可能小于 4.351 ,有 75% 的可能小于 6.626 ,有 95% 的可能小于 11.07 ,有 99% 的可能小于 15.09 。

我实验了 gcc 3.4.2 的 libc 中带的随机函数去模拟六面骰。做了五组实验,每组分别为 2000, 4000, 6000, 8000, 10000 次。得到的 V 的值分别为:

9.088 3.371 6.432 15.805 1.7204 

注:我使用了系统时间做种子,每次做此实验都会得到不同结果,本质上这些值也是随机的。

每组次数不同是因为:伪随机数列往往具有一定的周期性,当不知道它的周期特性时,n 选的不合适可能导致多段非随机带有某中倾向性的区间相互抵消其影响。

我们再次分析上面得到的五个数据,若随机数真的随机,他们出现的概率大约落在这样五个区间75%~95%) ,(25%~50%) ,(50%~75%),(99%~100%),(5%~25%)

表现不太坏,但也不算好。尤其是第四组实验数据,V=15.805 ,这是个很大的值。因为 V 值本应有 99% 的概率小于 15.09 ,所以出现这个值的概率应该只有不到 1% 。当然这也可能是个巧合(1% 的事件发生并不算太奇怪)。我后来又反复取不同的 n 测算了几次,有一次 V 又小于了 0.55 ,这也不太正常(也只有不到 1% 的可能性)。

最后,我的结论是:我用的 gcc 这个版本的 rand 函数不算很好。至少不能应用于极端要求随机性的场合。它对大量模拟六面骰这件事情上做的不太成功。

ps. 关于 χ 方分布的选定的百分值,可以参考《计算机程序设计艺术 第二卷 半数值算法》的 P39 页。上面我摘取的第五行。因为这里六面骰的点数分布有五个自由度(第六种点数的出现次数可以用其它五种出现次数推算出来)。


--------------------------------------------------------------------------------

前几天写过一篇 blog ,里面随手举了个例子:游戏设计人员设计了一个 10 万分之一的凋落率 。一个做策划的朋友在 gtalk 上问我,这并不是个复杂的问题呀。难道有什么玄机?

按这个朋友的思路,产生两次随机数就够了,一次 random(1,1000) 一次 random(1,100) ,只有两个数值都为 1 时,这个十万分之一个小概率事件才发生。

不错,理论上是这样,实际我们大多也这样的。而且很高兴看到,作为一个数值策划,他回避了直接用 random(1,100000) 。有编程常识的兄弟们都知道,大多数语言提供的标准数学函数库中不提供十万分之一级别精度的随机函数。

但是精度问题依然存在。我反过来问如果产生一个十万分之七的随机数时,他出现了一点小失误:random(1,100) * random(1,1000) <=7 是不对的。当然这个小错误很容易被修正。

实际应用中,更为正确的做法是回避直接使用高分辨率的随机数列。因为通常所用的线形同余序列产生的伪随机数列都不适用(道理很简单,每个随机数的精度要求提高意味着伪随机数列的周期变短,过短的周期性必然带来随机性的丧失)。如果真的有这类需求,我们应该让程序员去专门写一个了。

不光是这种超高精度随机数的需求应该尽量被回避。单次随机量的自由度也最好被限制。计算机模拟丢硬币总比模拟投六面骰看起来要真实一些。而模拟六面骰又好过二十面。用固定面数的骰子模拟出来,也比数值设定时八卦一个百分比概率要强。

原因并非完全源于它们需要的精度不同。更重要的是自由度小一些的随机量,更容易被统计方法检验是否合理。一旦程序产生的伪随机数随机性被检验出来不太好,我们总有机会去尝试一个更好的,不是吗?


桂ICP备07017180号