智游城

标题: 请教一个概率问题 [打印本页]

作者: shfe    时间: 2012-7-16 19:57
标题: 请教一个概率问题
80个球,40个红球和40个黑球,从这80个球中取20个,得到红球和黑球分别是10个的概率是?


作者: Howard    时间: 2012-7-16 21:19
(40 choose 10) * (40 choose 10)
------------------------------------------------  = 20.32%
          (80 choose 20)
作者: Howard    时间: 2012-7-16 22:00
迄今为止,城里见到的最难的概率题是老墙的一个问题:巴萨皇马在238场比赛里边从未出现某一队连胜五场的概率。难度体现在两个方面

1. 用到不熟悉的数学知识
2. 出乎意料的难,因为看似很简单。

那道题在http://www.zhiyoucheng.com/thread-3486-1-1.html
作者: 伟大的墙    时间: 2012-7-17 06:10
Howard 发表于 2012-7-16 21:19
(40 choose 10) * (40 choose 10)
------------------------------------------------  = 20.32%
         ...

有这么大?
感觉太大了。
作者: treeqy001    时间: 2012-7-17 06:27
  有个实际要算的题目,霍老能不能帮忙算下?有人拿100万百家乐,每次压1万,输光或者赢到20万就停,输光或者赢20万各有多少概率?简化为每次都是50 50掷硬币输了输10000,赢了要抽2.5%,赢9750.
作者: youngtercel    时间: 2012-7-17 07:34
伟大的墙 发表于 2012-7-17 06:10
有这么大?
感觉太大了。


This is against intuition but it is correct.

作者: shfe    时间: 2012-7-17 08:01
本帖最后由 shfe 于 2012-7-17 08:08 编辑

问这个概率问题事出有因。
一在新葡京打牌的渔夫,偶进新马路上的卖白鸽票的荣兴,惊奇称发现一个可稳定获利的项目,并实战2天,确实获利了。
白鸽票规则:80个球,编号为1到80,1-40为小,41-80为大。每次摇出20个球,结果10个大10个小为中(音同钟),买中并中的话1赔4。
从出中的概率来看,等于买5次出一次,平均投入5个单位,收入4个单位,庄家比赌场任何一个游戏的优势都大,且大到不可思议。
但这哥们这2天确实运气好,赢了,且稳定地赢了。
他的方法是,先买一个单位,中了的话赢3个。不中,下次以预期收益3加上已经投入并输掉的合计数除以3,一直买到出中为止。我问他最多遇到多少次没有出,他说9次。呵呵。确实人品好,没遇到稍微大点的波动
作者: 伟大的墙    时间: 2012-7-17 11:35
shfe 发表于 2012-7-17 08:01
问这个概率问题事出有因。
一在新葡京打牌的渔夫,偶进新马路上的卖白鸽票的荣兴,惊奇称发现一个可稳定获 ...

按照计算结果他已经正ev了
20.32%略大于1/5,一赔4赌场略为赔钱

作者: youngtercel    时间: 2012-7-17 11:45
伟大的墙 发表于 2012-7-17 11:35
按照计算结果他已经正ev了
20.32%略大于1/5,一赔4赌场略为赔钱

????????????????????????????
作者: 伟大的墙    时间: 2012-7-17 11:56
youngtercel 发表于 2012-7-17 11:45
????????????????????????????

白鸽票规则:80个球,编号为1到80,1-40为小,41-80为大。每次摇出20个球,结果10个大10个小为中(音同钟),买中并中的话1赔4。
从出中的概率来看,等于买5次出一次,平均投入5个单位,收入4个单位,庄家比赌场任何一个游戏的优势都大,且大到不可思议。
作者: 老陈    时间: 2012-7-17 12:27
本帖最后由 老陈 于 2012-7-16 22:39 编辑
treeqy001 发表于 2012-7-16 16:27
有个实际要算的题目,霍老能不能帮忙算下?有人拿100万百家乐,每次压1万,输光或者赢到20万就停,输光或 ...


我用蒙特卡洛算法算出近似值:
赢:77.20%
输:22.80%
玩100次的EV是:77.20x200000-22.8x1000000=-7360000

程序如下:
  Dim Wins, Lose, Total As Integer
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Wins = 0
        Lose = 0
        Total = 1000000
        Dim I As Integer
        For I = 1 To Total
            Bacc()
        Next
        Me.Label1.Text = Wins
        Me.Label2.Text = Lose
        Me.Label3.Text = Wins + Lose
        Me.Label4.Text = Format(Wins / (Wins + Lose), "###.00%")
        Me.Label5.Text = Format(Lose / (Wins + Lose), "###.00%")
    End Sub
    Sub Bacc()
        Dim Chips As Double = 1000000
        Dim Ws As Double
        While True
            Randomize()
            Ws = Rnd()
            If Ws < 0.5 Then
                If Chips > 10000 Then
                    Chips = Chips - 10000
                Else
                    Lose += 1
                    Exit Sub
                End If
            Else
                If Chips > 10000 Then
                    Chips = Chips + 9750
                Else
                    Chips = Chips * 1.975
                End If
                If Chips > 1200000 Then
                    Wins += 1
                    Exit Sub
                End If
            End If
        End While
    End Sub

作者: Howard    时间: 2012-7-17 12:32
伟大的墙 发表于 2012-7-17 11:35
按照计算结果他已经正ev了
20.32%略大于1/5,一赔4赌场略为赔钱

老墙,我猜他说的1赔4跟blackjack不一样,是原赌注没收后的1赔4。blackjack是原赌注退回给你。

他说的这个,是典型的试图用betting system玩一个 -EV的游戏。任何 -EV的游戏都不可能使用任何betting system扳成+EV。这是是马丁格尔下注系统的一个小变体。

只不过会让人产生幻觉,因为它把结果构建了一个发散数列,用指数型的输钱换取线性的赢钱。
作者: Howard    时间: 2012-7-17 12:33
老陈 发表于 2012-7-17 12:27
用蒙特卡洛算法算出近似值:
赢:77.20%
输:22.80%

Visual basic好啊,用Excel就能验证了。我以为老陈只玩Java和C++呢
作者: treeqy001    时间: 2012-7-17 12:46
本帖最后由 treeqy001 于 2012-7-17 12:49 编辑

  70%多的机会赢吗?
作者: treeqy001    时间: 2012-7-17 12:51
跟想象的有点不一样
作者: treeqy001    时间: 2012-7-17 12:57
  我的感觉,玩百家乐,一次1万,很难赢到20万,玩一晚上,第二天基本都是输。。。
作者: Howard    时间: 2012-7-17 13:16
如果不计2.5%的手续费,则该赌徒的100万(在破产前)变成120万的概率是100/(100+20)= 80%
注意此结论80%,跟他一手押多少钱无关。他可以押10万,5万,1万,1千,1块钱,都可以。

只不过,他押一块钱,要想赢到120万,可能要打10000年。押10万,可能两把牌就够了。

如果计入这2.5%的手续费,可看作不公平硬币,每一手牌的期望值是 0.5 * (-10000) + 0.5*9750 = -125,相当于硬币一面向上的概率为0.49375,另一面是0.50125

则100万破产前变120万的概率为  (1-(0.50125/0.49375)^100 ) / (1-(0.50125/0.49375)^120) = 68.87%

怎么与老陈的结果偏差这么大?我倾向于相信simulation,暴力破解思路简单不容易犯错。今天太晚了明天再看吧
作者: 老陈    时间: 2012-7-17 13:52
本帖最后由 老陈 于 2012-7-17 00:19 编辑
Howard 发表于 2012-7-16 23:16
如果不计2.5%的手续费,则该赌徒的100万(在破产前)变成120万的概率是100/(100+20)= 80%
注意此结论80% ...


今天老霍是不是喝酒了?挑两个小错:
第一个 100/(100+20)=83.33%
第二个 0.49375应该改成0.49875
改完了咱俩的结果就接近了,你的是精确值,我的是近似值。

作者: Howard    时间: 2012-7-17 14:03
老陈 发表于 2012-7-17 13:52
今天老霍是不是喝酒了?挑两个小错:
第一个 100/(100+20)=83.33%
第二个 0.49375应该改成0.49875

我靠,老陈真是神人也,估计还打着牌呢,就能一举点中我三处要害
1. 83.33%   这也太丢人了
2. 0.49875   眼花了还是手抖了
3. 喝酒了     连这个都读对了!

只能说太神了!
作者: 伟大的墙    时间: 2012-7-17 14:16
Howard 发表于 2012-7-17 14:03
我靠,老陈真是神人也,估计还打着牌呢,就能一举点中我三处要害
1. 83.33%   这也太丢人了
2. 0.49875   ...

我读老陈今晚没打牌
作者: treeqy001    时间: 2012-7-17 14:58
  每手10000,期望值输-125,换成掷硬币一面应该是0.49375?
作者: 老陈    时间: 2012-7-17 16:22
treeqy001 发表于 2012-7-17 00:58
每手10000,期望值输-125,换成掷硬币一面应该是0.49375?

手续费12.5%用0.49375
作者: dfu2012    时间: 2012-7-17 22:43
本帖最后由 dfu2012 于 2012-7-17 22:48 编辑
Howard 发表于 2012-7-17 13:16
如果不计2.5%的手续费,则该赌徒的100万(在破产前)变成120万的概率是100/(100+20)= 80%
注意此结论80% ...


0.49375似乎没有错,但输的概率(另一面)应该是0.50625.

我推导了一下公式,和你的一致,但我觉得老陈的结果可能更精确,因为老陈有一些临界的条件处理,比如当筹码小于10000的时候,公式里似乎没有考虑这一层。不知道我理解的对不对。这个例子用老陈的方法可能更精确。

说一下公式推导的思路:

1. 不考虑手续费,则每一把胜率是50%,当筹码为N时,打到120万的概率是P(N),那么每次投注后筹码变成N-1和N+1的概率都是50%,对应的P(N-1)指的是当筹码为N-1的时候赚到120万的概率。

P(N)=0.5(P(N-1)+P(N+1)),根据这个可以推导出:P(N)=N*P(1).

P(120)=1,P(1)=1/120,算出P(100)=100/120


2. 考虑到手续费,做个等价转换,胜率调整到49.375%,为推导方便,N为筹码量N万筹码,每次下注1万,赢了筹码变成N+1,输了变成N-1,每次下注赢的概率计为W(win,即0.49375),输的概率计为L(lose,=1-W),P(N)表示当筹码为N时,能到达120万的概率,则:

P(N)=W*P(N+1)+L*P(N-1),可以推导出:P(N+1)-P(N)=(L/W) * ( P(N)-P(N-1) ),  

注意临界条件:P(0)=0,当筹码为0的时候可以打到120万的概率为0,那么 P(1)=W*P(2)+L*P(0)=W*P(2),这个细节对推导出正确的公式结果很重要。

最后:P(N)=P1*(1-(L/W)^n)  / (1-L/W),

当筹码N等于120的时候,P(120)=1,用P(100)/P(120)

当N=100即筹码等于100万时,P(100)=(1-(L/W)^100) /(1-(L/W)^120) ,

事实上,P(n)=(1-(L/W)^N) /(1-(L/W)^120)

令 L=0.50625,W=0.49375,则和火花的公式完全一致。

即:  P(100)=(1-(0.50625/0.49375)^100) /(1-(0.50625/0.49375)^120).

计算的结果比老陈的数字要小。

之所以出现这个偏差,我觉得原因可能在于,由于手续费的存在,在现实中筹码低于1万的时候,和我推导的公式用的前提条件已经不等价了,这个时候已经做不到每次压1万筹码,因此出现了不等价的情况。

从这个角度看,老陈的计算应该是更精确的结果。














作者: Howard    时间: 2012-7-18 02:51
1. 昨天我确实喝了点酒,加上要睡觉了时间紧迫,造成出现好几处错误。还有一处本来自己正确却被老陈成功bluff,也一并当作了自己的错误,就是dfu指出的0.49375问题。0.49375本身没错,是我把1-0.49375算错了,应该是0.50625。

2. 按照我和dfu分别独立推导出来、且相同的公式,100万打到120万的概率为(1-(0.50625/0.49375)^100) /(1-(0.50625/0.49375)^120) = 58.59%

3. dfu兄的确很厉害,我今天琢磨着可能是边界问题导致公式结果与模拟结果有差别,一看dfu兄已经写出来了。

4. 但我觉得,边界问题导致差别的原因,不是在N趋近于0的兵临失败端,而是在趋近于120万的濒临成功端。因为N不总是整万,造成成功时会有些“浪费”。比如一个小学生常见智力题:青蛙爬10尺井,每天向上三尺,每夜下滑两尺,问多久爬出去?如果不考虑边界条件,按我和dfu的方法,需要10天。若考虑边界,第8天即可触到井口出井。

5. 所以完全同意dfu的说法:老陈的模拟才是更精确的结果。至少是“应该”给出更精确结果。

6. 但我仍然怀疑这看似很小的边界,为何导致接近20%的差距?很可能还是有一方出了问题。我现在刚更新成Excel2010,测试老陈的程序很费劲。

7. 可以看出老陈作为程序员的素养。筹码小于1万的时候已经考虑在内。
作者: Howard    时间: 2012-7-18 03:23
本帖最后由 Howard 于 2012-7-18 03:25 编辑

刚才用老陈的程序,(改了些格式,例如Wins, Lose, Total应为Long型,A+=1改为Basic能认识的 A=A+1)用Excel 2010测试了一下。我没有测试1百万次,只有10万次,但结果应该是足够精确了。

Win: 57348次
Lose:42652次
Total:100,000次
Win Rate: 57.35%

又测试了一次,Win = 57346次,赢率还是57.35%

此结果与公式计算的58.xx%足够接近,又足够远离(差别1%正好反映了边界条件的影响)。看来这是符合real world的精确结果。
作者: Howard    时间: 2012-7-18 03:32
扩展一下,100万拿去打百家乐,还是那么个玩法,打到200万或输光滚蛋为止。
(1-(0.50625/0.49375)^100) /(1-(0.50625/0.49375)^120) =7.585%

200万的概率:7.585%
输光滚蛋的概率:1-7.585%=92.415%

这次的结果和实际结果应该非常接近,因为边界距离我们起步很远,边界条件的影响变小了。误差应该在0.5%之内。

作者: 伟大的墙    时间: 2012-7-18 03:36
Howard 发表于 2012-7-18 03:32
扩展一下,100万拿去打百家乐,还是那么个玩法,打到200万或输光滚蛋为止。
(1-(0.50625/0.49375)^100) /(1 ...

你们三个太牛逼了


作者: 伟大的墙    时间: 2012-7-18 03:39
伟大的墙 发表于 2012-7-18 03:36
你们三个太牛逼了

德福看过巴萨皇马那个题了吗?
作者: 老陈    时间: 2012-7-18 04:22
Howard 发表于 2012-7-17 13:32
扩展一下,100万拿去打百家乐,还是那么个玩法,打到200万或输光滚蛋为止。
(1-(0.50625/0.49375)^100) /(1 ...

我现在在外面,等回家我也算算。


作者: 老陈    时间: 2012-7-18 08:53
Howard 发表于 2012-7-17 13:32
扩展一下,100万拿去打百家乐,还是那么个玩法,打到200万或输光滚蛋为止。
(1-(0.50625/0.49375)^100) /(1 ...

不知道怎么搞的,就这个题目老是和你们算得的结果差别很大。我算
200万的概率:40.73%
输光滚蛋的概率:59.27%
我仔细检查了程序,没发现哪里有误
我把
if ws>0.5
else
endif
改为
if ws>0.5
end if
if ws<0.5
end if
也考虑了>和>=符号的问题,开始我认为实数比较没必要考虑=问题,事实改了后结果也没变化。
第二个考虑我的计算机CPU产生随机数是不是对PLAYER有利了,于是我把上面的>和<换了一下,计算结果还是一样。
修改后的程序如下:


   Const BUYIN = 1000000
    Const CASHOUT = 2000000
    Const BET = 10000
    Const COMMITION = 0.025
    Const CALCTIMES = 1000000
    Dim Wins, Lose As Integer
    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Wins = 0
        Lose = 0
        Dim I As Integer
        For I = 1 To CALCTIMES
            Bacc()
        Next
        Me.Label1.Text = Wins
        Me.Label2.Text = Lose
        Me.Label3.Text = Wins + Lose
        Me.Label4.Text = Format(Wins / (Wins + Lose), "###.00%")
        Me.Label5.Text = Format(Lose / (Wins + Lose), "###.00%")
    End Sub
    Sub Bacc()
        Dim Chips As Double = BUYIN
        Dim Ws As Double
        While True
            Randomize()
            Ws = Rnd()
            If Ws < 0.5 Then
                If Chips > BET Then
                    Chips = Chips - BET
                Else
                    Lose = Lose + 1
                    Exit Sub
                End If
            End If
            If Ws > 0.5 Then
                If Chips >= BET Then
                    Chips = Chips + BET * (1 - COMMITION)
                Else
                    Chips = Chips + Chips * (1 - COMMITION)
                End If
                If Chips >= CASHOUT Then
                    Wins = Wins + 1
                    Exit Sub
                End If
            End If
        End While
    End Sub

作者: 老陈    时间: 2012-7-18 09:12
本帖最后由 老陈 于 2012-7-17 19:39 编辑
Howard 发表于 2012-7-17 13:32
扩展一下,100万拿去打百家乐,还是那么个玩法,打到200万或输光滚蛋为止。
(1-(0.50625/0.49375)^100) /(1 ...


老霍的计算结果我认为有商讨的必要。
老霍在17楼提到与押多少无关,我改变一下押法。
第一手我押60万,赢了再押60万,如果两手都赢了,就超过200万了。
两手都赢的概率为25%,显然比你的结果大得多。
这次是坚果,不是Bluff。



作者: Howard    时间: 2012-7-18 10:29
楼上老陈:

具体的bug在哪里我还没来得及看,先回你一句。我17楼说的,跟押多少无关,严谨的说是不对的。至少要满足一下条件才能说跟押多少无关
1)无手续费的情况
2)目标值是起始值的整数倍。比如起始100万,只能说到200万、300万、500万等等是跟押多少无关
作者: Howard    时间: 2012-7-18 10:40
老陈用的是什么工具和语言,我看着像visual basic.net?

那种语言的integer我不知道是怎么定义的,在VBA里面这是有overflow的:
        Dim I As Integer
        For I = 1 To CALCTIMES
            Bacc()
        Next

因为Integer最大只有三万多。难道问题在这儿?
作者: 老陈    时间: 2012-7-18 10:58
本帖最后由 老陈 于 2012-7-17 21:15 编辑
Howard 发表于 2012-7-17 20:40
老陈用的是什么工具和语言,我看着像visual basic.net?

那种语言的integer我不知道是怎么定义的,在VBA里 ...


我用的是visual basic.net。Vba定义32位整数用Long。

我看了邓兄的公式推导过程,非常严谨,出问题的可能性较小,建议先检查数据。


作者: dfu2012    时间: 2012-7-18 11:00
本帖最后由 dfu2012 于 2012-7-18 11:19 编辑
伟大的墙 发表于 2012-7-18 03:39
德福看过巴萨皇马那个题了吗?


那题我理解上有点歧义,所以没仔细看。

原题目:巴萨和皇马德比238场,没有任何一个队连输5场过, 我们假设两队势均力敌,每次交锋都各50的概率赢
那么238场比赛不出现5连输或更多连输的概率有多大。

原来的题目是出现5连输或更多连输,这个题目和出现5连输或以上连输是等价的,另外把2个队简化成1个队。

问题转化为:1个队出现5连输或以上的概率是多少?

针对转化后的这个问题(和你原来的问题有些不同),说一下解题思路:

令N为比赛的场次,P(N)为满足5连输或以上的概率,

1)当比赛5场的时候,显然这个概率是1/(2^5), 即 P(5)=1/(2^5).   
参考:W W W W W的概率  (W代表赢,L代表输)

2)当比赛6场的时候,这个概率是1/(2^5)+(1/2)*1/(2^5), 即P(6)=(2+1)/(2^6),
参考: W W W W W X+L W W W W W   
(W代表赢,L代表输, X 代表任意)

3)当比赛7场的时候,这个概率是1/(2^5)+(1/2)*1/(2^5)+(1/2)/(2^5), 即P(7)=(2+1+1)/(2^6)

参考: W W W W W XX+L W W W W W X  +(WL W W W W W  +LL W W W W W)
(W代表赢,L代表输, X 代表任意)


当比赛8场的时候,尽量找多几场比赛,计算结果数值 。。。。

根据上面的数值找规律,试图得出结果,这是一种解题思路。

找出P(N),P(N-1),P(N-2)等之间的关系,从上面的参考看,P(N+M)和P(M)之间的规律是可以找出来的,然后借用初始条件,求出P(N)的表达式,这是第二种解题思路。

还有一种,我刚想到的,我觉得这个题可能可以借助排列组合来计算,这个回头好好想想。

转化后的题目和你的题目虽然本质一样,但答案显然会不同,没具体算。




作者: dfu2012    时间: 2012-7-18 11:08
本帖最后由 dfu2012 于 2012-7-18 11:26 编辑
老陈 发表于 2012-7-18 09:12
老霍的计算结果我认为有商讨的必要。
老霍在17楼提到与押多少无关,我改变一下押法。
第一手我押60万,赢 ...


我想火花主要指的是没有手续费的情况下压多少不影响结果。

没有手续费的时候,从解题逻辑看,从公式看,压多少不影响结果,都是100/120,这个可以用程序运行校验下。


有手续费的时候,从解题逻辑看,压多少决定了N的大小,从公式看,这显然会影响结果。


没有运行程序的环境,否则我也试一下,很多年不写程序,重新设置太麻烦,偷个懒,等你们的结果。
作者: dfu2012    时间: 2012-7-18 12:34
本帖最后由 dfu2012 于 2012-7-18 12:41 编辑

我感觉,在胜率是0.49375%,每次下注1万丢硬币,起始资金是100万的前提下。
得出赚到120万的概率公式:P(N)=(1-(L/W)^N)/(1-(L/W)^120),  就以上前提,我觉得这个公式应该不会出错,
如果老陈根据这个前提条件改下程序,我想计算的结果和这个公式的结果会非常的一致。

那么问题可能出在:

丢硬币和扣手续费,虽然EV一样,但这个命题的概率计算(到达120万的概率),两者很可能是不等价的。

当扣除了2.5%的手续费,用胜率是0.49375%的抛硬币去等价原来的命题,虽然两者EV都等于-125,但这个等价或许是不成立的。就是说,即便EV相同,下注额一样,但胜率不一样,不能得出两种情况下(即使忽略边界的影响)的概率计算是等价的。

举个例子,即便令每次下注的EV都等于-125,如果每次下注20万,则100万到120万的几率应该大于62.5%,这个和每次下注1万的概率结果不一样.
就是说EV相等不能保证概率计算等价,当然这里用了不同的下注额。如果用同样的下注额1万,既然和老陈的结果有那么大的差异,我想很可能也是不等价的。

(就丢硬币的情况而言,公式的推导过程不简单,不考虑边界(P(2),P(1),P(0))的影响,公式的结果偏差会很大,不仔细很容易错,我算错几次,最后才和火花的一致。)
作者: treeqy001    时间: 2012-7-18 14:26
百家乐,100万,每次下1万,赢到200万的机会应该非常小
作者: 老陈    时间: 2012-7-18 14:59
本帖最后由 老陈 于 2012-7-18 01:08 编辑
dfu2012 发表于 2012-7-17 22:34
我感觉,在胜率是0.49375%,每次下注1万丢硬币,起始资金是100万的前提下。
得出赚到120万的概率公式:P(N) ...


建议检查一下23楼的公式推导过程。
我看:P(N)=W*P(N+1)+L*P(N-1)
好像:P(N)=L*P(N+1)+W*P(N-1)
如果这里错了,后面就全要重算了。
作者: 老陈    时间: 2012-7-18 15:43
dfu2012 发表于 2012-7-17 22:34
我感觉,在胜率是0.49375%,每次下注1万丢硬币,起始资金是100万的前提下。
得出赚到120万的概率公式:P(N) ...

我现在打牌,等回家后我改一个程序,重新计算一下,看看结果。
作者: dfu2012    时间: 2012-7-18 17:19
本帖最后由 dfu2012 于 2012-7-18 17:43 编辑
老陈 发表于 2012-7-18 14:59
建议检查一下23楼的公式推导过程。
我看:P(N)=W*P(N+1)+L*P(N-1)
好像:P(N)=L*P(N+1)+W*P(N-1)


我是这么定义的:

每次下注量为1万,N为当前的筹码量N万(单位是万),P(N)指以当前的筹码量打到120万的几率。
P(N+1)指以(N+1)万的筹码量打到120万的几率。
P(N-1)指以(N-1)万的筹码量打到120万的几率。


W为每次下注赢的几率,L为每次下注输的几率,W=1-L. 这个例子W=0.49375, W比L小。

那么,当筹码量为N万的时候下注1万,赢的时候(W)筹码变成N+1,输的时候(L)筹码变成N-1。

那么,对应的P(N)=W*P(N+1) + L*P(N-1), 这个思路不知道有没有问题,请指教。

如果依据上述思路得出的公式是合理的话,经过等价变形,则有:

  P(N+1)-P(N)=(L/W) * ( P(N)-P(N-1) ),
  P(N)-P(N-1)=(L/W) * ( P(N-1)-P(N-2) ),
  ........
  P(3)-P(2) = (L/W) * ( P(2)-P(1) ),

另外 :P(1)=P(2)*W+P(0)*L,P(0)=0,所以 P(2)=P(1)/W

全部相加:P(N+1)-P(2)=(L/W)(P(N)-P(1))   。
          P(N+1)=(L/W)*P(N)-(L/W)*P(1)+(1/W)*P(1)=(L/W)*P(N)+P(1)

即:    P(N+1)=(L/W)*P(N)+P(1)                    。。。。公式1

全部相乘:P(N+1)-P(N)=((L/W)^(N-1))  *  (P(2)-P(1))=((L/W)^N)*P(1)

即:   P(N+1)-P(N)= ((L/W)^N)*P(1)        。。。。公式2

实际上用公式2就可以直接得出: P(N+1)=P(1)* (1+(L/W)+(L/W)^2+....+(L/W)^N )

即:                                          P(N+1)=P(1)*(1-(L/W)^(N+1))/(1-L/W))       。。。公式3           

不熟悉的用公式1带入公式2,也可以得出公式3.

已知:  P(120)=1,

        P(N)=P(N)/P(120)= ( 1-(L/W)^N ) / (1-(L/W)^120)


以上是推导过程。






作者: 老陈    时间: 2012-7-18 17:51
本帖最后由 老陈 于 2012-7-18 04:08 编辑

W为每次下注赢的几率,L为每次下注输的几率,W=1-L.
那么,当筹码量为N万的时候下注1万,赢的时候(W)筹码变成N+1,输的时候(L)筹码变成N-1。
那么,对应的P(N)=W*P(N+1) + L*P(N-1), 这个思路不知道有没有问题,请指教。

不敢指教,共同讨论。
我的思路是你想用P(N)打到120万,那P(N)的来源有两种可能,一是在N+1时输了,二是N-1时赢了。不知道想偏了没有。

作者: 老陈    时间: 2012-7-18 18:00
本帖最后由 老陈 于 2012-7-18 04:06 编辑

再说计算。
我改变每次下注数额,1000,5000,20000,30000,50000,结果都非常接近,只是计算时间不一样,少算得慢,多算得快。老霍在17楼提到“与押多少无关”,我认为有手续费时照样适用。定性地说,如果玩家能用改变下注数额提高实现达到目标的概率是不可能的,因为每一次下注都是一个独立事件。
改用胜率来计算,无手续费,结果也都非常接近我原来的计算结果。


作者: dfu2012    时间: 2012-7-18 18:19
本帖最后由 dfu2012 于 2012-7-18 18:35 编辑
老陈 发表于 2012-7-18 17:51
W为每次下注赢的几率,L为每次下注输的几率,W=1-L.
那么,当筹码量为N万的时候下注1万,赢的时候(W)筹 ...


我们思路好像不一样。

P(N)是指当手里有N万筹码的时候,后面无论输还是赢,也就是说无论输赢的路径如何,到达120万的几率。

“我的思路是你想P(N)打到120万,那P(N)的来源有两种可能,一是在N+1时输了,二是N-1时赢了。不知道想偏了没有。”,
(当筹码为N+1无论后面输赢都可能打到120万,当筹码为N-1无论后面输赢也都可能打到120万。)

P(N)的来源的确有两种,分别来自P(N+1)和P(N-1).

P(N+1)指在筹码量为N+1时包含了所有可能到达120万的路径的几率,不考虑路径的细节,只知道从这里到120万的几率是P(N+1)就好。

P(N-1)指在筹码量为N-1时包含了所有可能到达120万的路径的几率,不考虑路径的细节,只知道从这里到120万的几率是P(N-1)就好。

W和L指的是当筹码量为N的时候,有W的几率变成N+1筹码,有L的几率变成N-1的筹码,

当筹码量为N的时候,到达120万的几率是P(N), 经过1轮下注,会出现两种路径:

A)有W的可能性走N+1这条路。如果走N+1这条路,那么到达120万的几率是 :  W*P(N+1)


B)有L的可能性走N-1这条路。如果走N-1这条路,那么到达120万的几率是 :  L*P(N-1)

这个路径选择,基于当筹码为N万时候的胜负,胜(W)则走P(N+1)这条路,输(L)则走P(N-1)这条路,

总的路径就是:W*P(N+1)+L*P(N-1),  这个结果和P(N)应该是等价的,即:

P(N)=W*P(N+1)+L*P(N-1)


这里计算的内涵和EV计算的会有点不一样,这里算的是各种路径的可能,不知道我这么理解对不对。



作者: dfu2012    时间: 2012-7-18 18:29
本帖最后由 dfu2012 于 2012-7-18 18:52 编辑
老陈 发表于 2012-7-18 18:00
再说计算。
我改变每次下注数额,1000,5000,20000,30000,50000,结果都非常接近,只是计算时间不一样, ...


无手续费,如果转换成丢硬币模式,从公式看,和下注的金额无关,到达120万的几率都一样。

有手续费,如果转换成丢硬币模式,从公式看,我觉得,每次下注的金额最终似乎还是会影响到达120万的几率。

这个几率虽然影响了,但EV始终还是负的,就是说无论对手如何调整,比如增加下注额,即便他到达120万的几率提高了,但他总的EV无论如何都是负的,只是负的少一些。

如果说手续费模式下,下注金额的改变不会影响到结果,那或许更能说明手续费模式和硬币模式也许是不等价的(虽然每次下注的EV是一样的,但到达120万的概率计算不等价)。

不知道这么理解对不对。

还有种可能:公式的推导有问题,可能是哪里缺了点什么,我再想想哪里出问题了。
作者: Howard    时间: 2012-7-18 21:29
dfu2012 发表于 2012-7-18 11:00
那题我理解上有点歧义,所以没仔细看。

原题目:巴萨和皇马德比238场,没有任何一个队连输5场过, 我们 ...

有思路就是胜利。有想法就是突破。
作者: Howard    时间: 2012-7-18 21:54
@老陈  @dfu2012

有手续费的时候,我觉得是要影响成功概率的。可以考虑一个极端的例子辅助思维:手续费不是2.5%,而是99%。

这种条件下,显然凭直觉即可判断,100万玩到101万,每次压1万是几乎不可能的,因为胜利等同于是(赢的次数比输的次数的100倍还多100次),这肯定比破产的几率要小得多。但是如果上来就100万全押,则确保有50%的成功概率。

用公式算,却不考虑下注大小,因为下注大小不是公式组成部分。这可能就是边界问题造成公式不适用。


作者: Howard    时间: 2012-7-18 22:35
刚才用老陈的程序跑了一下10万次次的 “100万打到200万”,在Intel Core i5-2450M 2.50GHz的CPU,4G内存上跑了两分钟左右,结果如下:

Win:7190次
Lose:92810次
Total:100000次
Win Rate:7.19%
与公式的计算结果非常吻合。

老陈你为什么算的不一样呢?我贴一下全部程序(Excel 2010 VBA ):


Const BUYIN = 1000000
Const CASHOUT = 2000000
Const BET = 10000
Const COMMITION = 0.025
Const CALCTIMES = 100000

Dim Wins, Lose As Long

    Private Sub Button1_Click()
        Wins = 0
        Lose = 0
        Dim I As Long
        For I = 1 To CALCTIMES
            Bacc
        Next
        Label1.Caption = Wins
        Label2.Caption = Lose
        Label3.Caption = Wins + Lose
        Label4.Caption = Format(Wins / (Wins + Lose), "###.00%")
        Label5.Caption = Format(Lose / (Wins + Lose), "###.00%")
    End Sub
   
    Sub Bacc()
        Dim Chips As Long
        Chips = BUYIN
        Dim Ws As Double
        While True
            
            Ws = Rnd()
            If Ws < 0.5 Then
                If Chips > BET Then
                    Chips = Chips - BET
                Else
                    Lose = Lose + 1
                    Exit Sub
                End If
            Else
                If Chips >= BET Then
                    Chips = Chips + BET * (1 - COMMITION)
                Else
                    Chips = Chips + Chips * (1 - COMMITION)
                End If
               
                If Chips > CASHOUT Then
                    Wins = Wins + 1
                    Exit Sub
                End If
            End If
        Wend
    End Sub

作者: 老陈    时间: 2012-7-19 01:28
本帖最后由 老陈 于 2012-7-18 11:30 编辑
Howard 发表于 2012-7-18 08:35
刚才用老陈的程序跑了一下10万次次的 “100万打到200万”,在Intel Core i5-2450M 2.50GHz的CPU,4G内存上 ...


老霍运行的程序我有两处疑点,一变量Chips应该定义为Double,这个问题对结果有影响,可能影响不大。二是在语句WS=Rnd()前我用了一条初始化随即数序列的语句,没有这条语句产生的WS可能不是随机数。老霍可以监视一下WS变量的值验证一下,我用Visual Basic .Net 确实如此。
作者: Howard    时间: 2012-7-19 02:48
本帖最后由 Howard 于 2012-7-19 02:48 编辑

@老陈,

第一, Chips数是Double还是Long,如你所说,应该影响不大。我觉得Long反而更符合现实情况一点,最小筹码不会低于1元。但无论用哪个,结果都应该相差很小

第二,我删掉那句话的原因是:暂时没有在VBA中找到对应的语句,只好删了。但根据结果判断,无论是120万还是200万,程序运行结果都和公式计算结果吻合,随机数应该没造成什么麻烦。我的猜测是,Rnd()产生随机数不是真随机的情况,只有大规模科学运算和大型网络游戏之类的才需要考虑,像我们这种规模的程序,Rnd()已经足够随机。

        即使如此,我还是试图验证了一下。检验一个序列是否符合随机数特征,是很麻烦的事儿。我只能先看ws变量在0.5以上和在0.5以下的次数比较。经过十万次的模拟,结果如下(200万或输光):
Win:7190次
Lose:92810次
Total:100000次
Win Rate:7.19%
ws大于0.5:49998
ws小于0.5:50002

如此接近,可看作满足随机数了。另外这次模拟居然7190次跟上次分毫不差,不知道是巧合还是奇怪。
作者: Howard    时间: 2012-7-19 02:51
又运行了一遍(10万次):

Wins: 7178次
Loses: 92822次
Total: 10万次
Win rate: 7.18%
ws大于0.5比ws小于0.5多出来的次数:12
作者: 老陈    时间: 2012-7-19 07:11
Howard 发表于 2012-7-18 12:48
@老陈,

第一, Chips数是Double还是Long,如你所说,应该影响不大。我觉得Long反而更符合现实情况一点, ...

生成随机数次数怎么和计算次数一样了?
输光和200万,每次押1万问题,我计算100000次,要产生随机数超过628,000,000次。
作者: 老陈    时间: 2012-7-19 07:46
本帖最后由 老陈 于 2012-7-18 17:54 编辑
Howard 发表于 2012-7-18 12:51
又运行了一遍(10万次):

Wins: 7178次


你的结果对,我的程序有问题,已经找到了

   While True
             Randomize()
             Ws = Rnd()

应该改成

   Randomize()
   While True
             Ws = Rnd()

每次都初始化随机数序列是画蛇添足,因为系统产生随机数序列初始化命令在没有参数的情况下,系统调用系统时间做为初始化的种子,由于计算速度非常快(Visual Basic .net 2010, Windows7-64, Intel(R) Core(TM)i7-3770K CPU @ 3.50GHz, 8G RAM),如果计算两次的时间间隔小于系统时间的分辨率时就会产生相同的随机数,反而不随机了。
以前没注意这个问题,又学到东西了。


作者: Howard    时间: 2012-7-19 09:14
本帖最后由 Howard 于 2012-7-19 09:14 编辑
老陈 发表于 2012-7-19 07:11
生成随机数次数怎么和计算次数一样了?
输光和200万,每次押1万问题,我计算100000次,要产生随机数超过6 ...


哈哈,老陈,其实我只计算了一个Flag值,初始值0,每次赢了(随机数大于0.5)就加1,输了就减1。

那次算完Flag是+2,结果我未及多想,就编造结果50002 vs 49998了,就这个数也没编对,如果+2,应该是50001 vs 49999。你说这不胡闹吗。让你一抓就抓个正着。


你的randomize()原来还有这个功效。看来是好心办坏事了,但正是这种东西体现了程序员的功力。我计算正确纯属歪打正着,因为VBA没有这个函数,就把那一行直接删除了,结果反倒删对了,你说哪儿说理去。

另外你的机器牛叉,可以算1百万次。我的机器1百万次等了10好几分钟出不来结果,直接关闭程序,改成10万次了。

甭管怎么样,结果是出来了。可以给发问的人一个交代
作者: 老陈    时间: 2012-7-19 10:01
本帖最后由 老陈 于 2012-7-18 20:53 编辑
Howard 发表于 2012-7-18 19:14
哈哈,老陈,其实我只计算了一个Flag值,初始值0,每次赢了(随机数大于0.5)就加1,输了就减1。

那次算 ...


这个初始化语句太坑人了,我又写了一段用此方法计算圆周率的程序,不加这条语句计算精度达到7位,加上这条语句精度只有5位,速度严重降低,多花二倍时间。

     Dim X, Y As Double
        Dim InPI As Integer = 0
        Randomize()
        For I = 1 To 100000000
            X = Rnd()
            Y = Rnd()
            If X * X + Y * Y <= 1.0 Then
                InPI += 4
            End If
        Next
        LabelPI.Text = InPI / 100000000
作者: treeqy001    时间: 2012-7-19 11:05
  多谢几位指导!我数学不行,老霍的公式对我非常有用,能算好多东西。
作者: treeqy001    时间: 2012-7-19 11:07
还有,拿100万玩百家乐,每次压1万,能玩到200万的概率,竟然有7%还多,比我以前想象的要高很多.
作者: dfu2012    时间: 2012-7-19 11:27
本帖最后由 dfu2012 于 2012-7-19 11:39 编辑
Howard 发表于 2012-7-18 21:54
@老陈  @dfu2012

有手续费的时候,我觉得是要影响成功概率的。可以考虑一个极端的例子辅助思维:手续费不 ...


先祝贺下找到误差的原因。

再继续说点分歧,

“用公式算,却不考虑下注大小,因为下注大小不是公式组成部分。这可能就是边界问题造成公式不适用。”

我的看法:用公式算,下注大小会影响结果。

公式1: P(N)=(1-(L/W)^N)/(1-(L/W)^120) 。

手续费模式:
每次下注1万,考虑到2.5%的手续费,EV是-125

转化为投硬币的公式模式:

1)每次下注2万,令下注2万的EV也等于-125,得出W和L,这个W和L与每次下注1万的W和L不同。公式计算和W,L相关,W和L变化了,会影响计算结果。

2)我在公式1的推导中,用的是每次下注1万的前提,即每次计数单位是1万,如果每次下注2万,即每次以2万作为计数单位,那么N就要除以2,120就要改成60,比如每次下注2万的P(100)=(1-(L/W)^50)/(1-(L/W)^60).

综合上面2条,P(N)的结果会受到下注大小的影响。

举一个具体的例子,初始资金100万,每次下注20万,投硬币模式,胜率大概比50%稍微小点,下注3次后,到达120万的几率至少在62.5%附近,这里只计算了100万直接到120万的50%概率和100万到80万后再到120万的12.5%的概率,考虑到其他无数路径,实际结果远大于62.5%。这个结果显然和下注1万用公式计算的结果(好像是小于60%吧)不同。


                                       路径1
                                      --------------  到达120万(约50%几率)
                  
100万下注20万后----------                                                                     路径3
                                                                                                     ------------- 回到100万(约50%几率)
                                     ---------------  到达80万(约50%几率)----
                                           路径2                                                 -------------- 到达60万(约50%几率)
                                                                                                       路径4

作者: dfu2012    时间: 2012-7-19 12:00
本帖最后由 dfu2012 于 2012-7-19 12:06 编辑

手续费模式下注1万的EV是-125,令公式模式下注20万的EV等于-125,则
当每次下注20万的时候,W=0.4996875,L=0.5003125,P(100)=(1-(0.5003125/0.4996875)^5)/(1-(0.5003125/0.4996875)^6)
用公式算的结果大约是:83%。
这个结果逼近了无手续费的结果100/120.

当然这里下注20万使用的是在手续费模式下下注1万时的EV(-125),现实中这不可能。

如果手续费模式下也下注20万,则WL不变,W还是=0.49375,L=0.50625,但N改变了,再计算,

P(100)=(1-(0.50625/0.49375)^5)/(1-(0.50625/0.49375)^6) = 82.27%

从上述计算可以看出,在负胜率状态下,加大投注额(等于减少投注次数),可以最大程度的减少损失,也就是说使EV负的最少。

所以,赌场娱乐,一次过全押最好,赢了就走,虽然也是-EV的策略,但这是最好的策略,其他策略都是必输的结局,下注越小,次数越多,输光的可能性越大,不怕你赢,就怕你不玩。
作者: 老陈    时间: 2012-7-19 12:36
dfu2012 发表于 2012-7-18 21:27
先祝贺下找到误差的原因。

再继续说点分歧,

下注大小确实影响计算结果,我那一处错不但结果偏差很大,还导致了下注大小不影响计算结果错误结论,我恨死那条语句了,差点误导了弟兄们,真丢人。
作者: 老陈    时间: 2012-7-19 12:54
dfu2012 发表于 2012-7-18 22:00
手续费模式下注1万的EV是-125,令公式模式下注20万的EV等于-125,则
当每次下注20万的时候,W=0.4996875,L ...

我支持你最后的结论,当你玩的次数越多,输和赢的次数越接近,玩家付出的手续费就越多,离输光就越近。
作者: shfe    时间: 2012-7-19 13:35
本帖最后由 shfe 于 2012-7-19 13:39 编辑

老陈,火花,德芙。你们仨位同学在我的贴子里讨论别人的问题,偶就不计较了。
但现在罚你们帮我做一道题目,谁有时间谁做,谁做的快,到澳门或者大陆时我请喝茶。

我有一串数据,想请你们谁帮编个程序测试一下,我先说下情况:
一串文本格式的数据,由3个不同的数字组成(1,2,3),共几十万个,我想得到按下列规则检验得到的检验结果
1:从头到尾检验这串数据
2:如果是2或者3,计数为1,后面继续为2或者3,累计计数。举例23232233,检验结果就是累计为8
3:如果遇到1,暂不计数,继续往后面检验,直到出现3为止计数为1,并和前面的计数继续累计。1后面的2忽略,举例2323223313,累计为9。232322331223,也是累计为9,这个1后面不管有几个2,都忽略。
4:如果1后面没有出现3又出现1,仍然暂不计数,直到出现2个3,才计数为1,并和前面累计。举例232322331133或者是232322331221223或者2323223312213都累计为9。同理23232233111333或者2323223312123133累计为9.意思就是出现1后,必须出现3才计数为1并和前面累计,1后面没有同样数量的3一直不计数。
5:按此规则一直检验并且一直累计计数,直到出现累计4个1(1111,12111,113111,1213111,112131311),停止计数,并将前面的累计数记录下来,然后重新按此规则循环。
举例:233累计为3,23313累计为4,233123累计为4,233132累计为5,23311113333累计为4,233121213131333累计为4。2331111或者23312111或者233113111或者23311311或者23312131221停止计数并将累计数3记录下来然后重新开始循环。

愿意帮我编个程序检验一下请留个邮箱给我,我将数据发给你,非常感谢!
作者: dfu2012    时间: 2012-7-19 13:41
本帖最后由 dfu2012 于 2012-7-19 14:35 编辑

再延伸下,这个话题或许能适用于德州扑克的风险和利润的计算。

做个简化,比如: 初始资金为100万,目标是M,要么到达M,要么输光的打法,每次下注额是B,在胜率为W的情况下,到达M的概率有多大。

公式 P(100,M,B)=(1-(L/W)^(100/B))/(1-(L/W)^(M/B))

令M分别为120万,200万。

W是扣除佣金等之后的胜率,令W=51%(扣除手续费后能否达到这样的胜率?),每次下注分别为1万,2万,5万,20万
M=120万,

P(100,120,1)=(1-(49/51)^100)/(1-(49/51)^120)=98.98%,破产概率=1.02%
P(100,120,2)=(1-(49/51)^50)/(1-(49/51)^60)=95.09%,破产概率=4.91%
P(100,120,5)=(1-(49/51)^20)/(1-(49/51)^24)=89.23%,破产概率=10.77%
P(100,120,20)=(1-(49/51)^5)/(1-(49/51)^6)=84.95%,破产概率=15.05%

从这个结果看,1万和20万下注到达120万的概率相差不大,但20万下注速度会快很多。

M=200万
P(100,200,1)=(1-(49/51)^100)/(1-(49/51)^200)=98.20%, 破产概率=1.98%
P(100,200,20)=(1-(49/51)^5)/(1-(49/51)^10)=54.98% , 破产概率=45.02%


从上述计算可以很明显的看出,当优势是51:49的时候,如果只下注1万,无论是到120万还是200万,都有98%以上的成功率,而破产的概率极小。但花的时间会很长。

如果每次下注20万,到120万的概率是84.95%(对应的破产率是15.05%),依然不低。
但到200万的概率只有54.98%,而破产的概率却有45.05%。

假如我们带100刀上赌场打德州扑克,目标是要么120刀就走人,要么破产,如果扣除手续费后我们的优势是51:49,
那么每次(可以理解每个牌局)下注1刀,达到目标的可能性是98.9%。如果每次下20刀,则84.95%的成功率。

假如我们带100刀上赌场打德州扑克,目标是要么200刀就走人,要么破产,如果扣除手续费后我们的优势是51:49,
那么每次(可以理解每个牌局)下注1刀,达到目标的可能性是98.2%。如果每次下20刀,则只有54.98%的成功率,相应45.02%的破产率。

矛盾是:下的注小了,打的时间长,很疲劳,可能优势会下降,下的注大了,破产的几率增加的太多了。
解决之道: 提高胜率,将胜率从51:49(扣除手续费之后)提高到55:45,每次下注20万到达200万的概率,我们再看看结果:

P(100,200,20)=(1-(45/55)^5)(1-(45/55)^6)=90.48%

这个结果,我自己看到也很震惊,仅仅是多了几个点的优势,到达目标VS破产的数值变化如此之大,看来提高胜率是王道啊,这同时也说明找鱼打是多么的重要,因为只有鱼才可能给我们55:45的优势啊。



作者: dfu2012    时间: 2012-7-19 13:53
本帖最后由 dfu2012 于 2012-7-19 14:36 编辑
老陈 发表于 2012-7-19 12:36
下注大小确实影响计算结果,我那一处错不但结果偏差很大,还导致了下注大小不影响计算结果错误结论,我恨 ...


老陈,其实看你和火花等人的帖子并参与讨论,我收获很大。

你拿出来的牌例,我揣度一般都是思考过的,有启发的,比如小同花那个牌例,需要20倍潜在的下注筹码,我后来自己算了遍,的确如此,对位置,筹码量,以及小同花或小顺子的策略和打法,理解上比原来深了很多。

我出的错比你们多多了,刚开始也惭愧,后来就无所谓了,所以出点错也好,以后就没什么压力了。一般来说,看你们的帖子,对你们的结果都很放心,但我一般要自己验证下,主要为的是加深理解。
作者: 老陈    时间: 2012-7-19 14:37
dfu2012 发表于 2012-7-18 23:41
再延伸下,这个话题或许能适用于德州扑克的风险和利润的计算。

做个简化,比如: 初始资金为100万,目标是 ...

以前我只知道打小Game并且有鱼比打大Game没有鱼好打,你的这一结论使我的判断得到了理论上的证明。
作者: 老陈    时间: 2012-7-19 23:04
本帖最后由 老陈 于 2012-7-19 09:08 编辑
shfe 发表于 2012-7-18 23:35
老陈,火花,德芙。你们仨位同学在我的贴子里讨论别人的问题,偶就不计较了。
但现在罚你们帮我做一道题目 ...


你会使用VB吗?或其它什么语言?这个程序我能写。你能把这串数据的实际意义贴出来吗?




欢迎光临 智游城 (http://zhiyoucheng.co/) Powered by Discuz! X3.2