欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

*游戏策略探讨

程序员文章站 2024-02-26 21:44:22
...

过年在家无聊,有朋友发了一张图给我:
*游戏策略探讨
立即引起了我的兴趣,打算研究怎么玩该游戏才能有效在朋友之中胜出!

我把这个游戏的参与者分为玩家庄家,玩家需要支付2.99的红包才能开始游戏,如果达到上图满足条件,则庄家需向玩家支付一定金额的红包。

先算玩家中奖金额的期望:
*游戏策略探讨
玩家可以得到的期望金额为3.10元,高于所需支付的2.99元的成本,很明显这个游戏对于玩家来说血赚。但是从我自己参与和朋友反应的情况来看,好像庄家的赢面更大,所以我打算自己写程序来玩玩这个游戏,看看如何参与游戏才能获利。

我定义两个量词“”和“”来区分接下来要叙述的内容。一“把”游戏定义为玩家A和庄家进行游戏的数量为1,例如进行了100把游戏,就是指玩家A发了100个2.99的红包给庄家。一“次”游戏定义为一个玩家和庄家进行了游戏,例如进行了100次游戏,就是指有100个玩家分别和庄家进行了游戏。

首先我模拟一次游戏玩10把,共有1000个玩家参与了该游戏,并输出了第一个玩家的结果:
*游戏策略探讨
可以看出来庄家和玩家的胜率不相上下,庄家赢了516名玩家,胜率在50%-55%左右,我多次运行了该程序,发现结果相差并不大。

接下来模拟一次游戏玩100把,依然是1000个玩家参与游戏:
*游戏策略探讨
从结果看似乎庄家和玩家的胜率差不多,但我发现多次运行程序以后,庄家的胜率一直低于50%,与上图的庄家胜率总高于50%有一定区别。

然而胜率依旧不是很高,和计算的数学期望不太相符,于是模拟一次游戏进行10000把的情况,依旧有1000名玩家参与:
*游戏策略探讨
可以看到这次的胜率差距非常明显,庄家的胜率仅为2.4%,多次运行程序后的区别也并不大。

当游戏进行的把数越多时,玩家的胜率也越高,越符合数学期望的计算结果,可以想象当进行的游戏把数*游戏策略探讨
时,玩家的胜率达到100%。不过这显然是不符合现实的,我们玩这个游戏的把数可能最多也就100把,那么怎样才能提高我们的胜率呢?

接下来我又做了一次模拟:
*游戏策略探讨

横坐标表示游戏进行的“把”数,从1到10000把;纵坐标表示100次游戏中庄家能赢的次数,加上百分比符号%可直接理解为庄家的胜率。

可以明显的看到随着把数越多,庄家的胜率在逐步降低,2000把时庄家胜率已经不足30%,10000把时庄家胜率不足10%。但是在正常人所能参与的1-100把游戏里,可以看到庄家胜率明显高于50%,意味着正常人参与游戏做庄家能够获利更多。(当然由于该程序是随机生成数字,所以存在一定的误差,但我认为尽管该误差存在,庄家胜率在正常人范围内依然高于50%)

为什么会有这样的情况?我清楚“期望”指的是在样本量足够大时才会显示的数学规律,但为什么在游戏把数进行的较少时,庄家的胜率如此之高?

不负责任的猜想如下:
*游戏策略探讨

如上表所示,玩家只有在获得3.88以上金额时才能获利,则概率为:
*游戏策略探讨
也就是说仅考虑时,玩家的胜率低于庄家。似乎是这样理解:如果玩家A仅仅和庄家玩一把,那么即使这一把玩家A的期望收益是3.10元,但他赢的概率仅仅有10/36,也就是说在此时此刻,玩家A能获利的几率是不高的。但如果放眼整体,此时此刻有许多玩家都在进行该游戏,相当于游戏的“把”数增加了,玩家的总体受益是要高于庄家的,即使你这把是亏损的,但其他玩家得到了更高的受益。

附python代码如下:

import numpy as np
import matplotlib.pyplot as plt

def count_win_amount(times):    #玩家赢的金额数量
    win_amount = 0
    for i in range(times):
        first = np.random.randint(1, 7)
        second = np.random.randint(1, 7)
        if first == 1:
            win_amount = win_amount + 0.88
        elif first == 2:
            if second != 6:
                win_amount = win_amount + 1.88
        elif first == 3:
            if second != 5 and second != 6:
                win_amount = win_amount + 3.88
        elif first == 4:
            if second == 1 or second == 2 or second == 3:
                win_amount = win_amount + 8.88
        elif first == 5:
            if second == 1 or second == 2:
                win_amount = win_amount + 12.88
        elif first == 6:
             if second == 1:
                 win_amount = win_amount + 28.88
    return win_amount

def one_play(times):    #模拟一次*
    print('本次*一共玩', times, '把')
    banker = 2.99 * times
    print('庄家一共得', banker, '元')
    player = count_win_amount(times)
    print('玩家一共得', player, '元')
    if banker >= player:
        print('庄家赢,共赢得', banker - player, '元')
    else:
        print('玩家赢,共赢得', player - banker, '元')

def get_banker_win_account(simulate_number, times): #模拟simulate_number次,返回庄家赢的次数
    banker_win_account = 0
    for i in range(simulate_number):
        banker = 2.99 * times
        player = count_win_amount(times)
        if banker >= player:
            banker_win_account = banker_win_account + 1
    print('如果庄家和', simulate_number, '名玩家进行游戏,最后庄家共赢了', banker_win_account, '名玩家')
    return banker_win_account

def plot(simulate_number, times):
    x = []
    y = []
    for t in range(times):
        x.append(t+1)
        banker_win_account = get_banker_win_account(simulate_number, t+1)
        y.append(banker_win_account)
    plt.figure()
    plt.scatter(x, y)
    plt.show()


times = 10000   #一次里玩的把数
simulate_number = 1000 #玩的次数
one_play(times)
get_banker_win_account(simulate_number, times)
#plot(simulate_number, times)
相关标签: Leisure time