伯特兰盒子悖论 C++模拟

最近看到了毕导发布的一个短视频:在一个只有两种颜色且比例随机分布的装有未知数量的小球的盒子中连续拿两个球,发现两个球是同样颜色的概论刚好为2/3。

使用c++模拟,采用了类似于毕导视频中插个隔板的思想,随机分配球的总数,随机分配隔板的位置,插好隔板后,隔板两边的数字可以视为两种不同的颜色,只要都比“隔板”大或都比“隔板”小即为同色。500000次模拟的结果差不多能精确到小数点后3位到0.666817

#include <stdio.h>
#include<stdlib.h>
#include <time.h>
#include<iostream>
using namespace std;
const int total_times=5000000;//总的尝试次数
int main(){
srand((unsigned int)time(NULL));
int same=0;
int showtime=10;
for(int i=1;i<=total_times;i++){
int ball_num=abs(rand())+2;//假设总的球的数量大于等于2
int div=rand()%(ball_num+1);//用于区分红球或绿球
int first,second,tmp=rand()%ball_num;
while(tmp==div)tmp=rand()%ball_num;
first=tmp;
tmp=rand()%ball_num;
while(tmp==div)tmp=rand()%ball_num;
second=tmp;
if((first-div)*(second-div)>0)//两次是同色的情况
same++;
if(i%(showtime)==0){
cout<<"i="<<i<<" p="<<(double)same/(double)i<<endl;
showtime*=10;//时间戳为指数形式
}
}
cout<<"outcome: p="<<(double)same/(double)total_times<<endl;
return 0;
}

原理如视频中所述,利用条件概率计算 :

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值