智游城

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: shfe
打印 上一主题 下一主题

请教一个概率问题

[复制链接]
21#
treeqy001 发表于 2012-7-17 14:58:39 | 只看该作者
  每手10000,期望值输-125,换成掷硬币一面应该是0.49375?
22#
老陈 发表于 2012-7-17 16:22:28 来自手机 | 只看该作者
treeqy001 发表于 2012-7-17 00:58
每手10000,期望值输-125,换成掷硬币一面应该是0.49375?

手续费12.5%用0.49375
23#
dfu2012 发表于 2012-7-17 22:43:37 | 只看该作者
本帖最后由 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万筹码,因此出现了不等价的情况。

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













24#
Howard 发表于 2012-7-18 02:51:25 | 只看该作者
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万的时候已经考虑在内。
25#
Howard 发表于 2012-7-18 03:23:34 | 只看该作者
本帖最后由 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的精确结果。
26#
Howard 发表于 2012-7-18 03:32:14 | 只看该作者
扩展一下,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%之内。
27#
伟大的墙 发表于 2012-7-18 03:36:36 | 只看该作者
Howard 发表于 2012-7-18 03:32
扩展一下,100万拿去打百家乐,还是那么个玩法,打到200万或输光滚蛋为止。
(1-(0.50625/0.49375)^100) /(1 ...

你们三个太牛逼了

28#
伟大的墙 发表于 2012-7-18 03:39:43 | 只看该作者
伟大的墙 发表于 2012-7-18 03:36
你们三个太牛逼了

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

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

30#
老陈 发表于 2012-7-18 08:53:47 | 只看该作者
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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|智游城论坛

GMT+8, 2024-9-20 19:53 , Processed in 0.047104 second(s), 8 queries , Redis On.

Powered by Discuz! X3.2

© 2001-2012 Comsenz Inc.

返回顶部