面试题:抛硬币

113 阅读4分钟

最近面试遇到一个比较有意思的面试题,有些思考,记录下来和大家分享。

问题

一万人参加抛硬币游戏,当一个人抛到一次正面即退出游戏,所有人都退出游戏后游戏结束,问游戏结束后正面出现的次数和反面出现的次数哪个多,推理的过程。

答案

这里只说合理的答案和解释,是不是最终答案或者正确答案需要大家自己判定。

我的回答

我认为反面出现的次数多,我是这样推理的:每次抛硬币出现正面或反面的概率都是 50%(不要杠硬币站立),那么一个人抛一万次,从概率上讲就是五千次正面和五千次反面,极端情况,前五千次都是反面,第五千零一次是正面,这时候游戏结束,那么反面的次数肯定多于正面;第二,正反面各 50% 的概率是在基数足够大时才能保证的,抛硬币次数小的时候,总会是向一边倾斜的,那么对于每一个人来说,因为抛到正面就结束,那么实验基数不会特别大,就最终结果来看,每个参赛者,只会抛到一次正面(这个时候结束了),但是可能抛到多次反面,那么总体来说反面的次数会多于正面。

面试官期待的答案

相等。从概率来说就是 50%,那么一万个人算是比较大的基数,基本能保证实际概率等于理想概率,那么第一轮游戏过后,就是五千正面后五千反面,依此类推游戏一轮一轮的往后进行,最终结果是一样多。

思考

这里有个小的脑筋转弯,游戏结束后,一共出现多少次正面?美女面试官让我 5 秒中回答,给我整懵了,你能 5 秒内答出来吗?—————————————————————————————————————————————————————————————————————————————————————————— 一万次,哈哈哈哈!

我觉得我的回答有道理的,同时也觉得面试官的答案也是有道理的(狗头)。So,该怎么办呢!? 这个时候就显示计算机相对于其他学科的好处了,那就是做平常实验的易操作性,做个计算机实验,写写代码跑一跑就可以了,你做物理、化学实验就没这么易操了。

package com.testcase;


import java.util.*;

public class Test {

    private static Random random = new Random();

    private static int obverseMore = 0;
    private static int reverseMore = 0;
    private static int eq = 0;

    private static final int SIZE = 10000;
    private static final int TIMES = 100000;

    public static void main(String[] args) {
        //
        for (int i = 0; i < TIMES; i++) {
            int reverseCount = 0;
            for (int j = 0; j < SIZE; j++) {
                while (!coinTossing()) {
                    reverseCount +=1;
                }
            }
            if(reverseCount == SIZE) {
                eq +=1;
            } else if (reverseCount < SIZE) {
                obverseMore +=1;
            } else {
                reverseMore +=1;
            }
        }

        System.out.printf("100 times exploration, obverse more times is: %d, reverse more times is: %d, equals times is: %d \n", obverseMore, reverseMore, eq);
    }

    /**
     *
     * @return true mean obverse or reverse
     */
    private static boolean coinTossing() {
        return random.nextBoolean();
    }

}

首先确认下我的实验代码逻辑是没问题的,因为正面次数是固定的,所以 while 循环中,抛硬币为反面时我们把 反面计数 reverseCount + 1,最后拿 reverseCount 和 10000 比较。用三个变量记录十万次实验的结果。

实验序号obverseMorereverseMoreequals
15008649616298
25003649677287
34989349803304
45005649667277
54992149802277
65028549457258

以上是我记录的一些实验结果

总结

从上面的实验结果来看,正反面相等的实验结果占比特别少,相比其他两个,随着实验次数基数增大,应该可以忽略了。正面和反面相比,乍一看,正面多于反面的实验结果总是要多一点,但是实验次数太少,并不能有太多的说服性。但是不管怎么说,理论上的相等,在实验中出现的概率太低了。

所以怎么样,理想的理论得出的结果还是太不靠谱了吧,哈哈哈!有兴趣的同学可以再做多点的实验,或者有其他办法证明这个问题,欢迎留言。

最后打个广告,失业找工作中,普通一本,6年Java,希望上海、苏州有推荐的,谢谢!