当前位置: 华文星空 > 知识

甲有101个硬币,乙有100个硬币,两人随机撒在地面上,甲比乙正面朝上多的概率是多少?

2021-02-15知识

甲赢的概率偏大一点点,简单无脑代码如下:

#include <stdlib.h> #include <time.h> void procedure ( int a , int b , int a_for_up_coin_num , int b_for_up_coin_num , int count ) { int a_win = 0 ; int i = 0 ; for ( i = 1 ; i <= count ; i ++ ){ for ( a = 1 ; a <= 101 ; a ++ ) { // 0表示反面 1表示正面 b = rand () % 2 ; if ( b == 1 ) { a_for_up_coin_num += 1 ; } } for ( b = 1 ; b <= 100 ; b ++ ) { // 0表示反面 1表示正面 a = rand () % 2 ; if ( a == 1 ) { b_for_up_coin_num += 1 ; } } if ( a_for_up_coin_num > b_for_up_coin_num ) { a_win += 1 ; } a_for_up_coin_num = 0 ; b_for_up_coin_num = 0 ; } printf ( "a WIn:%d-a/%d=%f \n " , a_win , count , a_win / ( count * 1.0 )); } int main ( int argc , char const * argv []) { int a = 2 ; int b = 1 ; int a_for_up_coin_num = 0 ; int b_for_up_coin_num = 0 ; int count = 0 ; srand (( int ) time ( 0 )); /*设置随机数bai种子*/ printf ( "Try:" ); scanf ( "%d" , & count ); procedure ( a , b , a_for_up_coin_num , b_for_up_coin_num , count ); return 0 ; }

然后写个小脚本方便做多次尝试

gcc aa . c && ./ a . out

确实接近0.5,而且基本0.5偏上, 这是在有打平的情况下还能够0.5偏上~

然后我把甲的投掷次数改成和乙此时一样,都是100次,作为参照组

for (a=1;a<=100;a++)

结果变成:

甲101次能够基本稳定0.5偏上,双方相同投掷100次的情况下,确实是正常水平(因为打平局存在不会真正的到0.5)

说明那一次多出来的投掷真的比较重要...直接突破了0.5大关

感谢评论帽子老哥指出错误....