python3如何实现对这个数学概率论问题的解决?邮箱与信封问题.

有5封信投入4个信箱,求下列事件的概率

1)第一,二号邮箱各投入一封信

2)有一个信箱有三封信

3)仅有一个信箱没有信

4)第二个信箱没有信

#注:每个信封(a,b,c,d,e)和信箱(A,B,C,D)都是不同的个体.
#如果可能的话,最好代码能够实现打印全部可能性以及每个问题的可能性



```python
import random
def mail_problem_handler(mail_num, mail_box, count):
    """

    :param mail_num:
    :param mail_box:
    :return:
    """
    all_set = []
    with open(r"C:\Users\ZhanJens\Desktop\fot_test01.txt", "w") as f:
        while len(all_set) < count:
            print(len(all_set))
            mail_box_dict = {}
            for b in range(0, mail_box):
                mail_box_dict[b] = 0

            key_list = []
            for i in range(0, mail_box):
                key_list.append(i)

            for m in range(0, mail_num):
                choice_box = random.choice(key_list)
                mail_box_dict[choice_box] += 1

            str1 = ""
            for x in mail_box_dict:
                str1 = str1 + str(mail_box_dict[x]) + '#'

            if str1 not in all_set:
                all_set.append(str1)
                f.write(str1 + "\n")
    return all_set

def Find_index(list, x):
    """
        找到list中x元素的下标
    :param list:
    :param x:
    :return:
    """
    for i, item in enumerate(list):
        if x in item:
            return i
    else:
        return None

if __name__ == '__main__':
    results = mail_problem_handler(5, 4, 56)  # 将5封信随机放入4个邮箱,会出现多少种可能性
    with open(r"C:\Users\ZhanJens\Desktop\fot_test01.txt", "r") as f:
        data = f.readlines()
        Q1 = 0
        Q1_list = []
        Q2 = 0
        Q2_list = []
        Q3 = 0
        Q3_list = []
        Q4 = 0
        Q4_list = []
        for i in data:
            one = i.split("#")
            if one[0] == '1' and one[1] == '1':
                Q1 += 1
                Q1_list.append(one)
            if "3" in one:
                Q2 += 1
                Q2_list.append(one)
            if "0" in one:
                one_copy = one.copy()
                zero_index = Find_index(one, "0")
                one_copy.pop(zero_index)
                if "0" not in one_copy:
                    Q3 += 1
                    Q3_list.append(one)
            if one[1] == "0":
                Q4 += 1
                Q4_list.append(one)

        print(Q1_list)
        print(Q1)
        print(Q2_list)
        print(Q2)
        print(Q3_list)
        print(Q3)
        print(Q4_list)
        print(Q4)

```
全集之所以为56 根据下图所得:

img

最终答案:
有5封信投入4个信箱,求下列事件的概率
1)第一,二号邮箱各投入一封信 4/56
2)有一个信箱有三封信 24/56
3)仅有一个信箱没有信 24/56
4)第二个信箱没有信 21/56

蒙特卡洛法,随机产生5个0-1的浮点数。如果数字在0~0.25之间,就算投入1号,0.25~0.5算2号……
然后看满足你四个条件的,对应的计数器变量+1
每次循环,试验次数+1
做足够多次
概率P=计数器/试验次数。