今天看了一篇文章《如何制定一个必赢的赌博规则》,讲的是纳什均衡的问题,感觉挺有趣。于是编程实现了一下,发现这个还真是能实现。

关于纳什均衡搜一下网上有很多的资料,这里主要讲的是纳什均衡中硬币正反的问题。

硬币正反问题:

假如你正在图书馆枯坐,一位陌生美女主动过来和你搭讪,并要求和你一起玩个数学游戏。美女提议:“让我们各自亮出硬币的一面,或正或反。如果我们都是正面,那么我给你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);

}

结果:

android 硬币正反面效果 硬币的正反面什么意思_#include

可以看出试验次数越多,赢的几率越高