今天看了一篇文章《如何制定一个必赢的赌博规则》,讲的是纳什均衡的问题,感觉挺有趣。于是编程实现了一下,发现这个还真是能实现。
关于纳什均衡搜一下网上有很多的资料,这里主要讲的是纳什均衡中硬币正反的问题。
硬币正反问题:
假如你正在图书馆枯坐,一位陌生美女主动过来和你搭讪,并要求和你一起玩个数学游戏。美女提议:“让我们各自亮出硬币的一面,或正或反。如果我们都是正面,那么我给你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);
}
结果:
可以看出试验次数越多,赢的几率越高