納什均衡-- 硬幣正反
今天看了一篇文章《如何制定一個必贏的賭博規則》,講的是納什均衡的問題,感覺挺有趣。於是程式設計實現了一下,發現這個還真是能實現。
關於納什均衡搜一下網上有很多的資料,這裡主要講的是納什均衡中硬幣正反的問題。
硬幣正反問題:
假如你正在圖書館枯坐,一位陌生美女主動過來和你搭訕,並要求和你一起玩個數學遊戲。美女提議:“讓我們各自亮出硬幣的一面,或正或反。如果我們都是正面,那麼我給你3元,如果我們都是反面,我給你1元,剩下的情況你給我2元就可以了。”那麼該不該和這位姑娘玩這個遊戲呢?這基本是廢話,當然該。問題是,這個遊戲公平嗎?
按我們平時正常想是:兩面都一樣(或正或反)概率為 1/4+1/4,則其數學期望
1/4 * 3 + 1/4 * 1 = 1
這看起來貌似是公平的,實際則不然。問題就出在硬幣是我們人為控制的,想正面就正面,想反面就反面,而上述情況只應在拋硬幣的時候才成立。想一想,如果我們能控制硬幣的正面和反面出現的概率,那麼贏的概率是不是會提高?
每一種遊戲依具其規則的不同會存在兩種納什均衡,一種是純策略納什均衡,也就是說玩家都能夠採取固定的策略(比如一直出正面或者一直出反面),使得每人都賺得最多或虧得最少;或者是混合策略納什均衡,而在這個遊戲中,便應該採用混合策略納什均衡。
假設我們出正面的概率是x,反面的概率是1-x,美女出正面的概率是y,反面的概率是1-y。為了使利益最大化,應該在對手出正面或反面的時候我們的收益都相等(不然在這個遊戲中,對方可以改變正反面出現的概率讓我們的期望收入減少),由此列出方程就是
3x + (-2)*(1-x)=(-2) * x + 1*( 1-x )
解方程得x=3/8。
同樣,美女的收益,列方程:
-3y + 2( 1-y)= 2y+ (-1) * ( 1-y)
解得y也等於3/8,而美女每次的期望收益則是 2(1-y)- 3y = 1/8元。這告訴我們,在雙方都採取最優策略的情況下,平均每次美女贏1/8元。而我們則虧1/8元。也即只要美女保持出正面的概率為3/8 就贏,當然這個前提是要不能只玩幾局,頻數接近3/8
程式碼實現(比較簡單應該都能看懂)
#include <stdio.h> #include <stdlib.h> #include "stdafx.h" #include <stdlib.h> #define SUM_COUNT 10000 int my[SUM_COUNT],your[SUM_COUNT]; int my_money_sum = 0,your_money_sum = 0; /*陣列my ,your 模擬每次出手時兩人的硬幣正反面,正面為1 ,反面為 0 */ void get_rand(int sum , int One_count) { int i = 0; int count = 0; for (i =0 ;i<sum; i++) { your[i] = rand()%2; my[i] = rand() % 2; if(my[i] ==1 ) { count++; } if(count > One_count) { my[i] = 0; } } } /*my_money_sum 和 your_money_sum 為雙方最後的所得*/ void count_the_money(int sum) { int i; for(i = 0; i<sum; i++) { if( my[i] == your[i]) { if (my[i] == 1) { your_money_sum += 3; } if(my[i] == 0) { your_money_sum +=1; } } else if( my[i] != your[i]) { my_money_sum += 2; } } } void main() { get_rand(SUM_COUNT,SUM_COUNT /8 *3); count_the_money(SUM_COUNT); printf("my_money_sum : %d \n",my_money_sum); printf("your_money_sum : %d \n",your_money_sum); }
結果:
可以看出試驗次數越多,贏的機率越高