賭徒問題進階版:初始賭本為2,賭注為1。輸則賭注加1,贏則賭注減1,直到賭注為0或賭本為0為止?
我的理解是“每次賭博過程的期望都是不賺不賠的”,但是是否這種情況下透過“劃定邊界”能讓過程的結果數值改變,我是不知道的。
可能是個馬氏過程?機率論學的非常渣別打我
我們這樣分解一下題目:
1 起始你有2元籌碼
2 你將會進行一次遊戲,這次遊戲的輸贏都是x(x為賭注)
3 這次遊戲的輸贏期望都是一半,輸=-x 贏=+x,本次遊戲的期望是0
4 進行下一次遊戲,調整賭注。(這個不影響期望值)
核心過程是2和3,其餘的過程只是調整引數而已,核心過程的期望值是不賺不賠,而4過程並不影響期望,可以得出是不賺不賠。
你把“修改賭注”這一個事件去掉,不影響期望,但是過程就簡單很多了。“修改賭注大小”不影響“賭本的期望值”,賭注大小和賭本期望是無關變數。
另外有一門課程叫做《隨機過程》也可以參考一下,我作為突擊黨實在不好意思說自己學過這門……
最終結果是 2
另一個問題是:飛機上有100個人,第一個人隨便坐,其餘人如果自己座位上有人的話就隨便坐,問最後一個人坐到自己作為的機率是多少?
====
補充一下,題主問:如果結束條件是“賭本為0”結束,也就是說輸光才讓走。
假設一種情景,你到賭場,Ex=0,但是賭場有個規定:輸光才能走。
那原題目可以這樣改動一下:
1 你有1元籌碼
2 你將會進行一次遊戲,這次遊戲的期望是不賺不賠,輸了賠1,贏了賺1
3 直到你的賭本為0時,結束遊戲
這樣從結果上看,顯然最後你的結局是輸光,但是這和期望沒有什麼關係,你的期望還是1。
假如你開10w執行緒,輸光時候掛掉,然後執行緒可以同步的進行(每個執行緒保持遊戲次數相同,掛掉的不算),那麼你每一刻去統計所有執行緒的總籌碼,應該依然是10w。可能最後只剩下1個執行緒了,但是這個執行緒有10w的籌碼。
如果你用無限個執行緒,那結果應該還是1,也就是我改動後的賭本。
但是,也存在極小的可能性,你只開了一個執行緒,但是死活它都沒法end
感覺還是比較穩定的~
using
System
;
namespace
拋硬幣問題
{
class
Program
{
static
void
Main
(
string
[]
args
)
{
Program
Prog
=
new
Program
();
int
Count
=
0
,
SumAll
=
0
;
while
(
Count
!=
50000
)
{
Count
++;
SumAll
+=
Prog
。
Work
();
float
Average
=
(
float
)
SumAll
/
Count
;
Console
。
Clear
();
Console
。
WriteLine
();
Console
。
WriteLine
(
“SumAll ”
+
SumAll
);
Console
。
WriteLine
(
“Count ”
+
Count
);
Console
。
WriteLine
(
“Average ”
+
Average
);
}
}
int
Work
()
{
int
Money
=
2
,
Fee
=
1
;
while
(
Fee
!=
0
&&
Money
>
0
)
{
if
(
Guid
。
NewGuid
()。
GetHashCode
()
%
2
==
0
)
{
Money
+=
Fee
;
Fee
——;
}
else
{
Money
-=
Fee
;
Fee
++;
}
}
return
Money
;
}
}
}
結果如下:
@王贇 Maigo 知乎又給我推送了三年前的題,估計大家都忘了吧。這次突然有了一點思路。
假設 第n次下住輸贏結果為X_n (贏為1,輸為-1),第n次下注之後賭注S_n,賭本T_n。
那麼
為i。i。d。 Bernoulli random variable,
為一維簡單隨機遊走。為了方便起見,令
,於是
歸納可得
所以這個問題就變成了
作為一個從1出發的簡單隨機遊走,碰到 0 (i。e。 贏) 或者碰到
(i。e。 輸光)的機率。
所以首先這個過程一定可以停止。(光碰到0的機率是1, 光碰到上邊的機率根據重對數律也是1)
然後停時有沒有 有限期望,以及optional stopping theorem是否還成立 還得再想想。
(如果停時期望有限,那麼S_n的增量是一致有界的。)
不過這個樣子看著比之前有希望多了。
跑了一百億次, 結果非常接近 2
這也沒啥, 更神奇的是似乎可以證明初始賭本為
, 最後期望帶走的金幣還是
這個過程是一個鞅,最後錢數的期望都等於最開始的錢數。。。
use
rand
::
Rng
;
use
rayon
::
iter
::
{
IntoParallelIterator
,
ParallelIterator
};
use
time
::
PreciseTime
;
const
TIMES
:
i64
=
100_0000_0000
;
#[allow(unused_variables)]
pub
fn
do_one
()
->
i64
{
let
mut
rng
=
rand
::
thread_rng
();
let
(
mut
coin
,
mut
now
,
mut
time
)
=
(
2
,
1
,
0
);
while
coin
>
0
&&
now
>
0
{
time
+=
1
;
if
rng
。
gen
::
<
bool
>
()
{
//贏了
coin
+=
now
;
now
-=
1
}
else
{
//輸了
coin
-=
now
;
now
+=
1
}
}
return
coin
as
i64
;
}
fn
main
()
{
let
start
=
PreciseTime
::
now
();
let
sum
:
i64
=
(
1
。。
=
TIMES
)。
into_par_iter
()。
map
(
|
_
|
do_one
())。
sum
();
let
end
=
PreciseTime
::
now
();
println
!
(
“coin mean: {}”
,
sum
as
f32
/
TIMES
as
f32
);
println
!
(
“finished in {} seconds”
,
start
。
to
(
end
));
}
停時稍微大一點點, 約為 2。07
比起離場金額, 這個問題更有趣的地方是停時的漸進表達吧。。。
若每次下注期望收益是x,那麼每賭一次賭本的期望就是加x,如果平均下注次數是n,初始賭本是s,那麼最終的賭本期望就是s+nx
不同的下注策略不會改變x,或者說不會改變期望收益率,即一次下注的期望收益比上單次下注金額,只會改變平均下注次數從而影響盈利情況
當x>0時,要使最後的賭本期望大,則n越大越好,就是有資金就投,從實際講這種情況往往能找到對沖的方法保證每次都穩賺不賠(有這種好事記得叫上我,哈哈)
當x<0時,應儘可能減小n,最好的辦法就是n取0,別去賭,如果一定要賭的話就是下一注,不管輸贏都走人……否則往往就是俗話說的“久賭必輸”
對於x=0,也就是公平情況,其實就是尋開心了……策略根本不會有任何影響,你說“那我就賭到輸光了才出來,不然就不走了,那不是一定輸光了嗎?”。這其實像隨機遊走,在一維的數軸上,初始在1,每次隨機各1/2機率向左或右走一個單位長度,0處是個坑,掉進去就結束了,一直走會怎樣?掉進0這個坑的機率是1,但是在數軸上位置的期望是1不是0,因為其實有一個極小的機率會走到極遠處,如同一個衝擊函式,位置期望恰好是1,說具體一點,比如初始1塊,每次下所有本金,那麼一次之後就是1/2機率2塊,2次之後就是1/4機率4塊,n次之後就是1/2^n機率2^n塊,所以期望本金始終還是1
所以對於公平賭局,不同策略只會改變遊玩次數,最後結束時的資金多少的分佈情況,但是不會改變資金的期望
以上。