“抛硬币”是一个非常传统的概率问题,相信大家也经常通过抛硬币去决定一些自己拿不定主意的事情。一般来说,我们总是假设硬币出现“正面朝上”或者“反面朝上”的概率均为0.5(当然也会有小朋友决定硬币“立起来”的时候才去写作业╮(╯╰)╭,我们不考虑“立起来”的情况)。最近,公众号“超级数学建模”发表了一篇文章,提到了一个非常有趣的“抛硬币”问题,文章链接:教你算一下概率,以后就可以称霸抛硬币游戏了
文章大概内容是,连续抛掷硬币,直到最近三次硬币抛掷结果为“正反反”或者“反反正”;前者你给我一元钱,后者我给你一元钱。看似公平的游戏,其实隐藏很大玄机,它并不公平。
具体分析大家可以参考原文,我就不介绍了。这里我给大家分享一下用计算机程序模拟的实验结果(此处胜率是指前一种情况的胜率),大家可以参考一下,语言分别是C++,C#,Java,Python,我个人感觉效率排序是C++>Java>C#>Python。
C++
#include
using namespace std;
int main(int argc, char *argv[])
{
int success=0,failure=0;
srand((unsigned)time(NULL));
for (int i=1;i
{
int result[3];
result[1]=rand()%2;
result[2]=rand()%2;
while (true)
{
result[0]=result[1];
result[1]=result[2];
result[2]=rand()%2;
if ((result[0])&&(1-result[1])&&(1-result[2]))
{
success++;
break;
}
if ((1-result[0])&&(1-result[1])&&(result[2]))
{
failure++;
break;
}
}
}
cout
return 0;
}
结果:成功次数:74932 失败次数:25068 胜率:0.74932
C#
using System;
class Program
{
static void Main(string[] args)
{
int success = 0, failure = 0;
Random random = new Random();
for (int i=1;i
{
int[] result = new int[3];
result[1] = random.Next(0, 2);
result[2] = random.Next(0, 2);
while (true)
{
result[0] = result[1];
result[1] = result[2];
result[2] = random.Next(0, 2);
if ((result[0] != 0) && (result[1] == 0) && (result[2] == 0))
{
success++;
break;
}
if ((result[0] == 0) && (result[1] == 0) && (result[2] != 0))
{
failure++;
break;
}
}
}
Console.WriteLine("成功次数:" + success.ToString());
Console.WriteLine("失败次数:" + failure.ToString());
Console.WriteLine("胜率:" + ((double)success / (success + failure)).ToString());
}
}
结果:
成功次数:74997
失败次数:25003
胜率:0.74997
Java
import java.util.Random;
public class Program
{
public static void main(String[] args)
{
int success=0,failure=0;
Random random=new Random();
for (int i=0;i
{
int[] result=new int[3];
result[1]=random.nextInt(2);
result[2]=random.nextInt(2);
while (true)
{
result[0] = result[1];
result[1] = result[2];
result[2]=random.nextInt(2);
if ((result[0] != 0) && (result[1] == 0) && (result[2] == 0))
{
success++;
break;
}
if ((result[0] == 0) && (result[1] == 0) && (result[2] != 0))
{
failure++;
break;
}
}
}
System.out.println("成功次数:"+String.valueOf(success));
System.out.println("失败次数:"+String.valueOf(failure));
System.out.println("胜率:"+String.valueOf((double)success/(success+failure)));
}
}
结果:
成功次数:75229
失败次数:24772
胜率:0.7522824771752282
Python
import random
success=0;
failure=0;
random.seed();
for i in range(1,100000):
result1=random.random();
result2=random.random();
while True:
result0=result1;
result1=result2;
result2=random.random();
if ((result0 > 0.5) and (result1 < 0.5) and (result2 < 0.5)):
success=success+1;
break;
if ((result0 < 0.5) and (result1 < 0.5) and (result2 > 0.5)):
failure=failure+1;
break;
print '成功次数:'+str(success);
print '失败次数:'+str(failure);
print '胜率:'+str(float(success)/(success+failure));
结果:
成功次数:75198
失败次数:24801
胜率:0.751987519875
综上,胜率稳定在0.75左右,这对于第二种情况显然是极为不利的。因此,看似公平的游戏,隐藏了巨大的玄机。如果大家感兴趣,欢迎留言讨论,如果您有其他语言的代码,欢迎分享。
瞌睡的小虫虫
ID:LittleSleepyWorm
领取专属 10元无门槛券
私享最新 技术干货