最近看到了毕导发布的一个短视频:在一个只有两种颜色且比例随机分布的装有未知数量的小球的盒子中连续拿两个球,发现两个球是同样颜色的概论刚好为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;
}
原理如视频中所述,利用条件概率计算 :