首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

用编程解决抛硬币问题

“抛硬币”是一个非常传统的概率问题,相信大家也经常通过抛硬币去决定一些自己拿不定主意的事情。一般来说,我们总是假设硬币出现“正面朝上”或者“反面朝上”的概率均为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

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180217G0M3HE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券