1. 程式人生 > >納什均衡-- 硬幣正反

納什均衡-- 硬幣正反

今天看了一篇文章《如何制定一個必贏的賭博規則》,講的是納什均衡的問題,感覺挺有趣。於是程式設計實現了一下,發現這個還真是能實現。

關於納什均衡搜一下網上有很多的資料,這裡主要講的是納什均衡中硬幣正反的問題。

硬幣正反問題:

假如你正在圖書館枯坐,一位陌生美女主動過來和你搭訕,並要求和你一起玩個數學遊戲。美女提議:讓我們各自亮出硬幣的一面,或正或反。如果我們都是正面,那麼我給你3元,如果我們都是反面,我給你1元,剩下的情況你給我2元就可以了。那麼該不該和這位姑娘玩這個遊戲呢?這基本是廢話,當然該。問題是,這個遊戲公平嗎?

按我們平時正常想是:兩面都一樣(或正或反)概率為 1/4+1/4,則其數學期望

1/4 * 3 + 1/4 * 1 = 1

,而一正一反的數學期望也是1/2 * 2 = 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);

}

結果:


可以看出試驗次數越多,贏的機率越高