Skip to content

Toudsour/Red-envelopes-Solitaire

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

8 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Red-envelopes-Solitaire

背景

现在在微信或者QQ上流行着一种红包接龙的游戏,对此游戏进行各种模拟个人收入并分析游
戏公平性。

游戏规则

  • 每个红包内塞入一定金额的钱,只能分给特定个人数的人
  • 红包先抢先得,抢到的人分的一定的随机金额(所有人的总净额为塞入的钱)
  • 抢到红包的内金额最大的发下一个红包,形成接龙

红包类实现

int GetTime();
class Packet
{
private:
    double Money;
    int Quota;
public:
    Packet(double  M,int Q);
    void SendPacket(int M,int Q);
    double GetMoney();
    double GetPrecent();
    double GetLeftMoney();
    int GetLeftQuota();
};
Packet::Packet(double M,int Q)
{
    Money=M;
    Quota=Q;
    srand(GetTime());
}
void Packet::SendPacket(int M,int Q)
{
    Money=M;
    Quota=Q;
    srand(GetTime());
}
double Packet::GetMoney()
{
    double Ans=0;
    if(Quota<=0)
        return Ans;
    if(Quota==1)
    {
        Quota--;
        Ans=Money;
        Money-=Ans;
        return Ans;
    }
    double Max=Money/Quota*2;
    double Min=0.01;
    Ans=Max*GetPrecent();
    Ans=((double)((int)(Ans*100)))/100;
    Ans=max(Ans,Min);
    Money-=Ans;
    Quota--;
    return Ans;
}
double Packet::GetPrecent()
{
    int Max=10000;
    int Rand=(unsigned)rand();
    Rand=Rand%Max;
    return (double)Rand/Max;
}
int GetTime()
{
    struct timeval Now;
    gettimeofday(&Now,NULL);
    return 1000000*Now.tv_sec+Now.tv_usec;
}
double Packet::GetLeftMoney()
{
    return Money;
}
int  Packet::GetLeftQuota()
{
    return Quota;
}

基本借鉴程鹏的回答

情形分析

情形一

红包获得情形 个人策略 环境 抢的顺序 实验代码
凡抢必得 抢取红包 与个人策略相同 固定 Game_1.cpp

参数1

参与人数 每人初始资金 红包金额 红包人数 游戏轮数
10 100 10 10 1000
实验结果
第一次
第1个人还有-15.88元
第2个人还有-12.44元
第3个人还有245.26元
第4个人还有51.93元
第5个人还有428.74元
第6个人还有70.12元
第7个人还有203.14元
第8个人还有128.09元
第9个人还有-29.89元
第10个人还有-69.07元   	
第二次
第1个人还有-0.17元
第2个人还有148.41元
第3个人还有227.92元
第4个人还有279.22元
第5个人还有368.78元
第6个人还有173.21元
第7个人还有-53.21元
第8个人还有148.93元
第9个人还有-162.38元
第10个人还有-130.71元   

我们发现在两次实验中最后两位好像一直在亏本,这是什么原因呢?

我们继续实验并输出运气王次数和抢到的总净额:


第一次

剩余金额:

第1个人还有27.94元
第2个人还有7.48元
第3个人还有275.32元
第4个人还有247.81元
第5个人还有271.21元
第6个人还有98.89元
第7个人还有286.33元
第8个人还有18.15元
第9个人还有-186.14元
第10个人还有-46.99元 

运气王次数:

第1个人运气王次数:108次
第2个人运气王次数:111次
第3个人运气王次数:81次
第4个人运气王次数:83次
第5个人运气王次数:83次
第6个人运气王次数:102次
第7个人运气王次数:84次
第8个人运气王次数:106次
第9个人运气王次数:127次
第10个人运气王次数:115次   

抢得金额:

第1个人抢的金额为:1007.94元
第2个人抢的金额为:1017.48元
第3个人抢的金额为:985.32元
第4个人抢的金额为:977.81元
第5个人抢的金额为:1001.21元
第6个人抢的金额为:1018.89元
第7个人抢的金额为:1026.33元
第8个人抢的金额为:978.15元
第9个人抢的金额为:983.86元
第10个人抢的金额为:1003.01元  
第二次

剩余金额:

第1个人还有83.83元
第2个人还有-65.73元
第3个人还有140.73元
第4个人还有367.98元
第5个人还有261.68元
第6个人还有110.2元
第7个人还有277.78元
第8个人还有4.42元
第9个人还有-46.62元
第10个人还有-134.27元 

运气王次数:

第1个人运气王次数:102次
第2个人运气王次数:118次
第3个人运气王次数:91次
第4个人运气王次数:75次
第5个人运气王次数:83次
第6个人运气王次数:99次
第7个人运气王次数:81次
第8个人运气王次数:111次
第9个人运气王次数:115次      

抢得金额:

第1个人抢的金额为:1003.83元
第2个人抢的金额为:1014.27元
第3个人抢的金额为:950.73元
第4个人抢的金额为:1017.98元
第5个人抢的金额为:991.68元
第6个人抢的金额为:1000.2元
第7个人抢的金额为:987.78元
第8个人抢的金额为:1014.42元
第9个人抢的金额为:1003.38元
第10个人抢的金额为:1015.73元  

分析

在这种参数情况下出现了一种很奇怪的现象,就是最后几名(尤其是最后两名)大部分情况下,总是亏本的,在多次试验之后也验证了这种情况。

分析数据之后我们发现,之所以最后两名容易亏本,主要原因是因为他们更容易成为运气王,而在这种情况下,运气王虽然好听,但是毫无疑问,成为运气王是一种很亏本的行为。

这是为什么呢?我们可以参看张景舒的回答,最后抽对于得到的金额期望于之前抽都是一样的,但是相比于之前抽,他的标准差更大,学过概率与数理统计的同学们知道,标准差表示了一个数据的稳定性,也就是标准差越大,数据越波动,换而言之,就是越容易成为运气王,因此越容易亏本。

根据以上数据分析,我们若是想在该种游戏中不亏本或者盈利,那么我们应该尽量在中间时段抢得红包。

情形二

红包获得情形 个人策略 环境 抢的顺序 实验代码
凡抢必得 抢取红包 与个人策略相同 随机 Game_2.cpp

参数1

参与人数 每人初始资金 红包金额 红包人数 游戏轮数
10 100 10 10 1000
实验结果
第一次
第1个人还有32.31元
第2个人还有-37.05元
第3个人还有58.27元
第4个人还有136.28元
第5个人还有188.4元
第6个人还有160.95元
第7个人还有111.31元
第8个人还有157.47元
第9个人还有-52.57元
第10个人还有244.63元
第二次
第1个人还有144.5元
第2个人还有206.17元
第3个人还有16.97元
第4个人还有138.74元
第5个人还有167.53元
第6个人还有75.43元
第7个人还有134.36元
第8个人还有91.98元
第9个人还有-17.86元
第10个人还有42.18元  
第三次
第1个人还有58.71元
第2个人还有83.83元
第3个人还有-12.69元
第4个人还有157.32元
第5个人还有12.69元
第6个人还有166.07元
第7个人还有167.98元
第8个人还有154.24元
第9个人还有145.04元
第10个人还有66.81元  

分析

在这种情况下,个人的亏损和盈利并没有什么规律性,而且分析数据可以发现,在1000轮下 也很少有人出现巨额的亏损,平均下来每轮的盈利/亏损都处于0.1元这个数量级。。。。 所以说,如果你想靠这个发家致富显然是不科学的想法。

情形三

红包获得情形 个人策略 环境 抢的顺序 实验代码
随机抢得红包 抢取红包 与个人策略相同 随机 Game_2.cpp

参数1

参与人数 每人初始资金 红包金额 红包人数 游戏轮数
10 100 10 5 1000
实验结果
第一次
第1个人还有-5.08元
第2个人还有2.3元
第3个人还有22.18元
第4个人还有172.48元
第5个人还有64.18元
第6个人还有26.14元
第7个人还有259.48元
第8个人还有269.42元
第9个人还有97.14元
第10个人还有91.76元 
第二次
第1个人还有148.41元
第2个人还有93.6元
第3个人还有90.72元
第4个人还有104.37元
第5个人还有211.17元
第6个人还有81.58元
第7个人还有163.84元
第8个人还有-74.12元
第9个人还有107.82元
第10个人还有72.61元 
第三次
第1个人还有125.75元
第2个人还有170.06元
第3个人还有65.45元
第4个人还有-44.15元
第5个人还有232.95元
第6个人还有113.45元
第7个人还有60.28元
第8个人还有202.08元
第9个人还有-54.58元
第10个人还有128.71元  

分析

在这种情况下,与上种情况并没有什么改变。

情形四

红包获得情形 个人策略 环境 抢的顺序 实验代码
随机抢得红包 当剩下的红包平均份额小于当前最大值 其它人抢取红包 随机 Game_3.cpp

参数1

参与人数 每人初始资金 红包金额 红包人数 游戏轮数
10 100 10 5 1000
实验结果
第一次
第1个人还有343.28元
第2个人还有160.88元
第3个人还有128.62元
第4个人还有-37.76元
第5个人还有104.19元
第6个人还有11.66元
第7个人还有20.11元
第8个人还有66.04元
第9个人还有72.05元
第10个人还有130.93元 
第二次
第1个人还有237.14元
第2个人还有47.07元
第3个人还有148.24元
第4个人还有-51.81元
第5个人还有246.49元
第6个人还有-0.05元
第7个人还有103.76元
第8个人还有11.48元
第9个人还有235.49元
第10个人还有22.19元 	
第三次
第1个人还有312.25元
第2个人还有107.03元
第3个人还有0.93元
第4个人还有55.09元
第5个人还有17.81元
第6个人还有67.25元
第7个人还有80.7元
第8个人还有162.18元
第9个人还有8.02元
第10个人还有188.74元 

分析

略施策略,稳赚不赔

总结

根据以上情况下:

  • 如果你每次抢得红包的次序都靠后的话,还是放弃吧,你坑定会亏得。
  • 如果你能看到领的情况下,看到已经有几个叫大的红包被领的话,快下手吧
  • 在红包接龙中抢不到也不要伤心,放心,发不了财。

写在最后

最近在亲戚群中实践了一下,10元/7包,80轮赚了20吧,基本只是保持在中间领,能看别人领的情况下还是比较少的。

欢迎大家在我的基础上进行更多探究。。。

如有写的不对的地方,请多指教!

About

针对红包接龙游戏的简单模型模拟

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages