甲赢的概率偏大一点点,简单无脑代码如下:
#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大关
感谢评论帽子老哥指出错误....