A,B,C三人 按順序從1-100中取一個數,後取的人知道前面的人去的數,每個人取得數不能相同?

A,B,C三人 按順序從1-100中取一個數,後取的人知道前面的人取的數,每個人取得數不能相同。然後從1-100中等概率地隨機選一個數,與這個數最接近的人獲勝,請問A該怎麼取,才能保證自己獲勝的概率最大?


就是個比較簡單的博弈問題,首先考慮最後行動的C,整個區間被A和B分成了三段,C要做的就類似於佔地盤,如果選A和B中間則得到中間這一段的50%,否則可以完整得到頭或者尾的一段(貼著別人報即可),選最長的一段。

再考慮B,如果B簡單貼著A占更長的那側(比如A選60,B選59),則C肯定會貼著B報,把B弄成個夾心餅乾……所以B的策略是,要麼貼著A報較少的那一側,把更長的主動讓給C……

(原答案在這後面有些問題,刪了重寫了)

所以B的策略是:

  1. 貼著A報較少的那一側,把更長的主動讓給C,大致可以取得較短一側的大小
  2. 如果較短一側的大小超過總長度1/4,則報在與A對稱的位置,比A少一格,讓C去另一側貼著A報,大致可以取得較短一側的大小+A和B中間區域的一半
  3. 報在較長一側遠離A的1/3的位置上,讓C報A和B中間,大致可以取得較長一側的1/2

任何情況下選2都比1要強,因此不需要考慮1了

則A如果報25以下的位置,則A取得較長一側的1/6 + 較短一側;如果報25以上的位置,則A取得50-較短一側大小,比前一種要少。

細化一下邊界條件:

A報25

B報76:

C報24或77則C佔24個位置

C報26-75則C佔25.5個位置

所以C報26-75,B佔37.25

B報75:

C報76佔25個位置,B佔25.5個位置

C報26-74則C佔25個位置,B佔38個位置

C在這些數中任選,B平均佔37.75個位置

所以B報75,A佔37.25個位置

A報26:

B報76:

C報25,佔25個位置,B佔49.5個位置

C報27-75,佔25個位置,B平均佔37個位置

C在這些數中任選,B平均佔37.25個位置

B報75:

C報25或76,佔25個位置

C報27-74,佔24.5個位置

所以C報25或76,B平均佔37.5個位置

所以B報75,A平均佔37.5個位置

結果是A報26,B報75,C報25或76


太長不看: A選擇26和75時勝率最大, 勝率為37.5%

順便說一句,此時B一定會選擇對稱的75/26, 也能獲得37.5%勝率

至於A的勝率隨數字的變化圖,想來應該是個挺好看的對稱曲線,以後有空了把下面的代碼一改就能畫出來

-------------我是口口口口口吃的分分分分割線------------------------

有趣的問題。

不過原題存在較大歧義,為了讓題設更嚴謹,我作出如下改動:

  1. 如果最後選到的點跟兩位玩家的距離相等且最小,那麼讓這兩位玩家各勝0.5局,第三位玩家告負。
  2. 如果一位玩家存在多種不同決策均可讓自己獲勝概率最大,那麼他將等概率地隨機地從這幾種決策中選擇一個,即不偏好於「坑害」某個特定的玩家

這樣一來,題目中的「勝率」就可以理解為這三人所選的數字「控制」的線段的長度了。其中每個人「控制」的點被定義為「到自己的距離比到其他人的距離更近的點」。

這有點像在二維、離散的空間里 做一個voronoi diagram, 用相鄰兩點的中點重新分割線段,割到最長線段者勝。

那麼如果你是C,看到線段上已經有兩個固定下來的點,設為p,q且p&

1. 選擇在這兩點的外側:那麼C應當緊貼著那個點,從而把它在自己外側的「領地」掠奪殆盡。(p-1 或100-q);

2. 選擇在這兩點的中間: 那麼C無論如何都只能拿到中間這段長度的一半。(q-p/2);

根據具體的p和q選擇自己最大的領地就好。

如果你是B,你發現了C的策略是相當顯然且公開的,那麼你在選完自己的點之後立刻可以知道C會選哪裡,也就知道了自己最終得到的「領地」有多大。

那麼你只要枚舉所有可能的選擇找到一個「領地」最大的可能性即可。

那麼最後來看A,對於A來說,B的策略也是公開且顯然的,那麼A也會做與B同樣的事情:枚舉100個可能的位置,計算出之後能拿到的最大「領地」。

剩下來的事情就交給編程解決吧。不過既然要編程了,100這個數也不算很大,為了降低編程複雜度乾脆連C也用枚舉法解決了算了(逃)

最近在學JAVA所以順手就用JAVA寫了…

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class SelectPoint {
public static final double EPSILON = 0.0001;

public static double[] length(int a, int b, int c) {
double result[] = new double[3];
int p, q, r; //排個序先
p = Math.min(a, Math.min(b, c));
r = Math.max(a, Math.max(b, c));
q = a + b + c - p - r;

double mid1 = (double) (p + q) / 2;
double mid2 = (double) (q + r) / 2;
double length1 = mid1 - 0.5;
double length2 = mid2 - mid1;
double length3 = 100.5 - mid2;
result[0] = a == p ? length1 : a == q ? length2 : length3;
result[1] = b == p ? length1 : b == q ? length2 : length3;
result[2] = c == p ? length1 : c == q ? length2 : length3;
return result;

}

public static List& C_select(int a, int b) {
List& result = new LinkedList&<&>(); //使用List來儲存大於一個可能的最優選項

double max = 0;
for (int i = 1; i &<= 100; i++) { if (i == a || i == b) continue; double[] lengths = length(a, b, i); if (Math.abs(lengths[2] - max) &< EPSILON) { result.add(i); } else if (lengths[2] &> max) {
result = new LinkedList&<&>();
result.add(i);
max = lengths[2];
}
}
return result;
}

public static Map&&> B_select(int a) { //返回B的選擇與相對應的C的選擇
double max = 0;
Map&&> result = new HashMap&<&>();
for (int i = 1; i &<= 100; i++) { if (i == a) continue; List& possibleC = C_select(a, i);
int N = possibleC.size();
double sum = 0;
for (Integer c : possibleC) {
double[] lengths = length(a, i, c);
sum += lengths[1];
}
double mean = sum / N;
if (Math.abs(mean - max) &< EPSILON) { result.put(i, possibleC); } else if (mean &> max) {
result = new HashMap&<&>();
result.put(i, possibleC);
max = mean;
}
}
return result;

}

public static List& A_select() {
List& result = new LinkedList&<&>();
double max = 0;
for (int i = 1; i &<= 100; i++) { Map&&> possibleBAndC = B_select(i);
//此處小心,每一對(a,b,c)並不是等概率的
int N = possibleBAndC.size();
double sum = 0;
for (Integer b : possibleBAndC.keySet()) {
List& possibleC = possibleBAndC.get(b);
int M = possibleC.size();
double sumM = 0;
for (Integer c : possibleC) {
double[] lengths = length(i, b, c);
sumM += lengths[0];
}
sum += sumM / M;
}
double mean = sum / N;
if (Math.abs(mean - max) &< EPSILON) { result.add(i); } else if (mean &> max) {
result = new LinkedList&<&>();
result.add(i);
max = mean;
}

}
return result;
}

public static void main(String args[]) {
List& possibleA = A_select();
for (Integer i : possibleA) {
System.out.println(i);
}

}
}


這個問題中的「模糊」挺有意思,像是玩RPG會產生很多結局。

如果B和C是合作關係,那麼A的勝率不可能超過1%。因為B和C可以"緊貼"著A選,A選k的話,B和C分別選k-1和k+1就行了(如果存在的話),除非搖出的數正好是k,其他情況A都不可能獲勝。

如果B和C各自想最大化勝率,考慮A選好後把1-100一分為二的場景,B肯定會選擇長的那邊入手。

  • 如果長邊不超過短邊的兩倍,B只要選長邊的中點,就可以讓同樣想最大化勝率的C去「緊貼」A以(幾乎)獨佔短邊。最終A能拿到的最大勝率正比於長邊的1/4, 不超過1/6.
  • 如果長邊不超過短邊的三倍,B只要選離A選2/3長邊距離處的點,就可以讓C去「緊貼」A以獨佔短邊。因為若C選擇待A和B中間的話,最多搶到正比於AB間一半長度的勝率,也就是長邊的1/3,對照前提,這並不如短邊。若C在B選點的另外一側緊貼,同樣也不會超過短邊。這種情況下A的最大勝率不超過AB間距離的1/2, 輔以一些不等式傳遞,可知是1/4。
  • 如果長邊超過短邊的三倍,B的最佳選擇仍是選距離A為2/3長邊處的點,這種情況下不管C怎麼選,B至少能拿到正比於1/3長邊的勝率。類似的,不管C怎麼選,他都只能拿到長邊的1/3,這時:
    • 如果C看B比較不爽,他可以緊貼B選點(左右皆可),最後A的勝率正比於短邊+長邊的1/3, 最多是1/2。
    • 如果C看A比較不爽,他可以緊貼A選點,最後A的勝率正比於短邊,最多是1/4
    • 如果C把AB各得罪一半,他就取AB中間,最後A的勝率正比於短邊+長邊的1/6, 最多是3/8

綜合這些情況,A的最佳策略是選擇距兩端1/4總長處的點,並儘力挑撥B和C的關係,最後在[1/4,1/2]勝率區間中拿到和C爺友好度同分布的一個值。


最大含義是什麼?是自己可能的最大概率值還是與BC比最大?
假設A選x(先設x<50),
設B選擇(101-y),B選擇後;限定C只
C可取AB間的一半,只要這個數大於x-1,C就不會選x-1;即x≥y≥(100-y-x)/2>x-1。
則x=y=(100-y-x)/2=25。
A應該拿25(或76),B拿76(或25);
而C取AB間任何數,獲勝概率都是25%,其他最大只有24%。
則A-B獲勝概率合計75%,各自25%-50%浮動。
如果C足夠理性,應該選最中間的50或51,讓其他兩人儘可能平分成37%和38%。
但是對C來說,獲勝概率遠小於1/3不說,且只有AB的2/3。任何選擇都不能改變自己獲勝的概率。那麼完全可以噁心AB之一,選26或(75),讓AB中一人也只有25%。
顯然這種方法A並不能保證三人中自己獲勝最大,但有最大可能是50%(C非完全理性),或38%(C完全理性)。
如果是要保證A在三人中最大,
正確的做法是讓C取到概率不會相差太多,C就會平均分配AB的概率,且不會出現B>A的情況。比如C32%,AB各自34%;C30%,AB各35%。
A可以選4,則B最佳選68,有32%的幾率獲勝的C必然會平均分配AB的獲勝概率34%和34%
A可以選10,則B最佳選61,有30%的幾率獲勝的C可能會平均分配AB的獲勝概率35%和35%。


A,B,C 取到的數分別為 x,y,z

A,B,C 取到最大值的概率分別為 P(A),P(B),P(C)

根據題意有 P(A) geq P(B) geq P(C)

限制 1 leq x leq 50 ,因為對於 x>50 的情況與 101-x 是完全對稱的

顯然 y>x ,因為如果 y<x ,C可以取 x+1 於是C的概率最大

於是如果 取z=y+1 , P(C) leq P(B) =>100-(y+1) leq (y-x)/2

如果取 z=y-1 , P(C) leq P(B) => frac{(y-1)-x}{2} leq 100-y

如果 取z=x-1 , P(C) leq P(A) => (x-1)-1 leq (y-x)/2

如果取 z=x+1P(C) leq P(A) => frac{y-(x+1)}{2} leq x-1

解得整數解 x=26,y=75

解方程方法可以把1&<=x&<=50, 99-y&<=(y-x)/2, (y-1-x)/2&<=100-y, x-2 &<=(y-x)/2, (y-x-1)/2&<=x-1複製到

Wolfram|Alpha: Making the world』s knowledge computable


獲勝的概率最大。
首先要使自己的收益最大,同時使對方的收益較低。
後者在這種三人博弈中比較重要。
首先我們看兩個人的情況。

首先我們設A的取值&<=50,B在51-100,因為1-50和51-100這兩種選擇是完全鏡像的,所以對最終結果沒有影響。
不難看出,A的獲勝區間在1-(x+y)/2(向下取整),而B在(x+y)/2-100(向上取整)
所以不難得出這種情況下雙方的選擇會是A:50,B:51(或對稱)
再看三人。

如果AB仍選擇A:50,B:51,那麼C在選擇時只需選擇49或52即可,這樣C佔有49個數字,A(或B)1個,剩下的B(或A)50個,這是此時C的最優選擇。
那麼A在面臨這樣的處境時,則會退出一步,選擇49,此時如果C選擇48,如果平手視作0.5個數字,則獲勝概率會變成A:1.5,B:50.5,C:48。而C選51則會變成A:49.5,B:0.5,C:50。因此C會選擇51。
那麼B為了避免這樣的處境,就會選擇和A鏡像的數字,且不斷向兩邊擴大,即A+B=101,直到C不再選擇在他們兩端的數字。
由上圖右下角不等式可以得到當C在AB之間選擇時需滿足A&<25.75,所以此時A:25,B:76。
而此時C在兩者之間選擇時,獲勝概率不會變,都是(B-A)/2=25.5,但為了降低AB任意一方的勝率以保證自己的勝利,C會選擇50或51。
則三方選擇為A:25,B:76,C:50/51。
而三方勝率為A:37/37.5,B:37.5/37,C:25.5。


換個思路,假如其他條件不變,100人來選呢?第一個隨便選都一樣。那麼50個人參加選呢,第一個怎麼選?再縮小參加人數呢?


25或者76

能保證在BC絕對理智的情況下,至少有0.25至多0.50的勝率(具體多少由C分配)。

這個其實就是圍棋的二維版本,金角銀邊。AB兩個把25和76一占,C就只能在AB中間選一個數,老老實實接受自己0.25勝率的事實,唯一能做的,就是靠近AB中其中一個人來噁心他了。

我是假設ABC不能互相通過交流影響他人選擇,否則C就靠最後一招噁心人威脅,就可以讓結局完全不一樣。


推薦閱讀:

博弈論的根基是把人當做絕對理性的機器嗎?
三體中的威懾論有現實意義嗎?
每個個體的理性行為會導致所在群體的非理性行為嗎?如果會,在實際活動或經濟學中有哪些相關例子或模型?
如果建一個維權權利代理平台,怎樣的拍賣機制會比較好?
有限次博弈是否存在合作關係?

TAG:數學 | 博弈論 | 趣味數學 |