python 实现 AIGC 大模型中的概率论:生日问题的基本推导

在上一节中,我们对生日问题进行了严谨的阐述:假设屋子里面每个人的生日相互独立,而且等可能的出现在一年 365 天中的任何一天,试问我们需要多少人才能让某两个人的生日在同一天的概率超过 50%。

处理抽象逻辑问题的一个入手点就是先形象化,简单化和实例化。首先不难理解一年只有 365 天,如果屋子里有366 人,那么一定有两个人的出身日期在同一天,此时概率是 100%。如果屋子里只有 1 个人,那么有两个人同一天生日的概率就是 0。试想如果屋子里有 183 人(365 的一半),这些人的生日不重复,于是这种情况将 365 天分成了相当的两部分,一部分属于那 183 人的生日,另一部分不属于 183 人的生日,此时进入第 184 人,这个人的生日只有两种可能,落入第一部分或者第二部分,由于两部分的天数一样多,那么他落入哪一部分的可能性都相同也就是 50%,如果落入第一部分,那么我们就得到两个人有相同生日的情况。由此可见,确切的答案一定在[2,184]之间。

此外解决逻辑问题,特别是算法问题,还有一种有效方法就是暴力破解。也就是我们把所有可能的情况一一罗列出来,找出合适的那个,然后再看看有没有好的方法改进暴力破解法。假设屋子里有 n 人,那么我们罗列出他们所有可能的生日情况,把这些情况中有出现重复的部分抽取出来。在简单情况下,屋子里只有 2 人,每个人的生日可能是 365 天中某一天,于是这两个人可能的生日组合是 365 * 365 = 133,225种情况(注意问题假设,屋子里人的生日相互独立)。 在这么多种组合中,两个人生日在同一天的情况有多少种呢?如果第一个人选定某一天后,第二个人必须跟他一样,由于第一个人只有 365种选择,因此两人生日相同的情况有 365 * 1 = 356 ,于是屋子里有 2 个人时,出现同一天生日的概率是 365 / (365 * 365) = 1 / 365 = 0.27%.

如果屋子里有 3 个人,那么生日情况就有 365 * 365 * 365 = 48,627, 125 种。这种情况比较复杂的是,如何考虑有两个人出现重复生日的情况,稍微大意就会出错。这里我们虽然考虑有两个人生日相同,但如果 3 个人同时生日相同,这种情况也能满足题目要求,所以不能遗漏,3 个人生日相同的情况数量就是 365 * 1 * 1 = 365种。除去 3 人同时生日相同的情况后,我们就能考虑只有 2 人生日相同的情况,如果假设前两个人生日相同,第 3 个人与前两个人不同,那么满足条件的情况就是 365 * 1 * 364 = 132,860,同理第 2 第 3 人生日相同,但第一人与后两人不同的情况也是365 * 1 * 364 = 132,860,最后第 1,3 两人生日相同,第 2 个人跟其他两个不同的情况也是365 * 1 * 364 = 132,860,由此屋子里有 3 个人,其中出现两个人生日相同的情况总数就是 132,860 + 132,860+132,860 + 365,由此对应概率就是(132,860 + 132,860+132,860 + 365)/ 48,627, 125 = 0.82%。

我们上面的枚举方法非常容易出错。要不就是多算了某种情况,要不就是少算了某种情况。例如三个人有相同生日时,我们只能将其算一次,我们不能把他看成第一第二个人生日相同算一次,然后第二第三个人生日相同算一次,然后第一第三个人生日相同又算一次,这么想我们就会将它算成 3 次。另外枚举法随着人数的增多也越来越难以使用,例如 4 个人的时候,我们要考虑只有两个人生日相同,只有三个人生日相同,4 个人生日相同等情况,还有更麻烦的情况是其中两个人生日共同在某一天,然后另外两个人生日又共同在不同的某一天,例如其中两人生日在 3 月 4 日,然后另外两人生日在 5 月 6 日等。

由此看来暴力枚举方法不是解决该问题的有效手段。在概率论上一个有效方法是从反面思考。例如我们直接考虑事件 A 的概率 p发现很难下手,那不妨先考虑非 A 的对应概率1-p,因为只要直到后者,那么前者自然迎刃而解。由此我们看看如果屋子里有 n 个人,那么他们没有人有相同生日的概率怎么算。如果每个人依次走入房间,那么第一个人进入房间时只有他自己,那么此时不可能有人跟他有相同生日,因此这时没有两人有相同生日的概率是 1, 也就是 365 / 365.第二个人接着进入,那么他的生日必须要跟第一个人不同,此时他有 364 种选择,因此此时两人生日不同的概率是 (365 / 365) * (364 / 365),这里用到的一个原则是,两个相互独立的事件,他们同时发生的概率等于两个事件概率的乘机。根据同样的规律,第 3 个人进入房间后,他有 365-2=363 种可能使得他的生日与前两人都不同,因此 3 人没有相同生日的概率是(365 / 365) * (364 / 365) * (363 / 365)。由此可以推测 n 个人进入屋子后,没有人生日相同的概率是(365 / 365) * (364 / 365) * (363 / 365) * … ((365 - (n-1)) / 365)。

这里需要注意的是分子变化,因为分母都是 365。对应第一个人分子是 365,第二个人是 364,因此到第 n 个人时,分子变成 365-(n-1)。我们把上面的连续乘积用符号表示如下:
请添加图片描述
如果我们使用阶乘简化上面公式,阶乘就是 n!= n * (n-1) * … 1,需要注意的是 0! = 1。我们把上面公式展开就是:
请添加图片描述
我们在分子和分母同时乘以(365-n)!,那么就有:

请添加图片描述
如果我们能找到一个最小的 n 值,使得上面公式计算结果小于 1/2,那么问题就能解决,因为当 n人中没有两个人的生日相同的概率小于 1/2,那么其相反事件的概率也就是至少有两人生日相同的概率就大于 1/2,如果使用 f(n)表示上面公式最右边的计算,我们用代码将它的图形画出来看看规律:

import matplotlib.pyplot as plt
import numpy as np
import mathdef no_share_birthday(n):return math.factorial(365) / (365 **n * math.factorial(365-n))x = []
for v in range(50):x.append(v)y = []
for v in x:y.append(no_share_birthday(v))plt.scatter(x, y)
plt.show()print(f"no share birthday with 22 people is :{no_share_birthday(22)}, and with 23 people is {no_share_birthday(23)}")

上面代码运行结果如下:
在这里插入图片描述

no share birthday with 22 people is :0.5243046923374499, and with 23 people is 0.4927027656760146

从绘制的图形看到随着 n 的值越大,对应两个人没有相同生日的概率逐渐减小,在 20 过去一点对应概率就在 0.5 以下,同时我们也在代码中打印出 22 人和 23 人情况下没有人有相同生日的概率,可以看到 22 人的时候概率还在 0.5 以上,到了 23 人概率正好低于 0.5,也就是说当有 23 人时,有两人生日在同一天的概率会超过0.5.

由此可见我们推导的公式可以计算对应概率,但也有问题。一是不够通用,如果一年的天数改变了,我们需要重新计算,例如在火星一年有 687 天,那么房间需要多少火星人才能让其中两个人生日同一天的概率大于 0.5 呢。另外上面的计算公式不够简洁,我们是否能推导出一个好看的数学公式来直接算出相应概率呢,我们下一节看看如何实现这些目标。更多内容请在 b站搜索 coding 迪斯尼。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/215714.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos 7.9 二进制部署 kubernetes v1.27.7

文章目录 1. 预备条件2. 基础配置2.1 配置root远程登录2.2 配置主机名2.3 安装 ansible2.4 配置互信2.5 配置hosts文件2.6 关闭防firewalld火墙2.7 关闭 selinux2.8 关闭交换分区swap2.9 修改内核参数2.10 安装iptables2.11 开启ipvs2.12 配置limits参数2.13 配置 yum2.14 配置…

css实现姓名两端对齐

1.1 效果 1.2 主要代码 text-align-last: justify; 1.3 html完整代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&quo…

【LeetCode刷题-树】-- 116.填充每个节点的下一个右侧节点指针

116.填充每个节点的下一个右侧节点指针 方法&#xff1a;层次遍历 /* // Definition for a Node. class Node {public int val;public Node left;public Node right;public Node next;public Node() {}public Node(int _val) {val _val;}public Node(int _val, Node _left, N…

MeterSphere实战(一)

MeterSphere是一位朋友讲到的测试平台&#xff0c;说这东西是开源的&#xff0c;因为我是做测试的&#xff0c;很乐意了解一些新鲜事物。在我看来&#xff0c;测试就是要专注一些领域&#xff0c;然后要啥都会一点点&#xff0c;接着融会贯通起来&#xff0c;这样就可以万变不离…

RCNN 学习

RCNN算法流程 RCNN算法流程可分为4个步骤 一张图像生成1K~2K个候选区域&#xff08;使用Selective Search方法&#xff09;对每个候选区域&#xff0c;使用深度网络图特征特征送入每一类的SVM分类器&#xff0c;判别是否属于该类使用回归期器细修正候选框位置 1.候选区域的生…

漏洞复现-泛微云桥 e-Bridge SQL注入(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

C51单片机中reentrant关键字的使用,关于MULTIPLE CALL TO FUNCTION警告的问题

关于可重入关键字reentrant的使用&#xff1a; 现象&#xff1a; 在一个项目中警告信息如下&#xff0c;提示该函数多次调用&#xff0c;因为该函数在串口中断和主循环中都有被调用。 影响&#xff1a; 如果在使用该函数期间被中断打断&#xff0c;而中断也调用了该函数&a…

文件管理和操作工具Path Finder mac功能介绍

Path Finder mac是一款Mac平台上的文件管理和操作工具&#xff0c;提供了比Finder更丰富的功能和更直观的用户界面。它可以帮助用户更高效地浏览、复制、移动、删除和管理文件&#xff0c;以及进行各种高级操作。 Path Finder mac软件功能 - 文件浏览&#xff1a;可以快速浏览文…

node.js和npm的安装与环境配置(2023最新版)

目录 安装node.js测试是否安装成功测试npm环境配置更改环境变量新建系统变量 安装node.js 1、进入官网下载&#xff1a;node.js官网 我选择的是windows64位的&#xff0c;你可以根据自己的实际情况选择对应的版本。 2、下载完成&#xff0c;安装。 打开安装程序 接受协议 选…

学习-面试java基础-(集合)

String 为什么不可变&#xff1f; 1线程安全 2支持hash映射和缓存。因为String的hash值经常会使用到&#xff0c;比如作为 Map 的键&#xff0c;不可变的特性使得 hash 值也不会变&#xff0c;不需要重新计算。 3出于安全考虑。网络地址URL、文件路径path、密码通常情况下都是以…

降低检索系统搭建门槛,轻松实现 RAG 应用!Zilliz Cloud Pipelines 惊喜上线

Zilliz Cloud 正式上线 Pipelines&#xff01; Zilliz Cloud Pipelines 可以将文档、文本片段和图像等非结构化数据转换成可搜索的向量并存储在 Collection 中&#xff0c;帮助开发者简化工程开发&#xff0c;助力其实现多种场景的 RAG 应用&#xff0c;将复杂生产系统的搭建和…

【已解决】SpringBoot Maven 打包失败:class lombok.javac.apt.LombokProcessor 错误

文章目录 出错原因解决办法总结 最新项目部署的时候&#xff0c;出现了一个maven打包失败的问题&#xff0c;主要是lombok这个组件出的问题&#xff0c;具体的错误信息如下&#xff1a; 我的lombok版本如下&#xff1a; <dependency><groupId>org.projectlombok&l…

Editplus安装教程(附带汉化教程与获取注册码教程)

文章目录 前言一、Editplus简介1. 简介2. 特点和功能 二、Editplus5安装步骤1. 下载EditPlus52. 运行安装程序3. 接受许可协议4. 选择安装位置5. 选择组件6. 完成安装7. 启动EditPlus8. 注册EditPlus 三、Editplus4安装步骤1. 下载EditPlus42. 安装EditPlus43. 注册码获取 四、…

代码随想录算法训练营 | day48 动态规划 198.打家劫舍,213.打家劫舍Ⅱ,337.打家劫舍Ⅲ

刷题 198.打家劫舍 题目链接 | 文章讲解 | 视频讲解 题目&#xff1a;你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被…

python实战演练之迎接冬至的第一场雪

写在前面 WINTER IS COMING Python实现大雪纷飞的效果&#xff0c;完整代码在文末哦~ 准备开始 WINTER IS COMING Python是一种高级编程语言&#xff0c;Turtle是Python的一个图形化模块&#xff0c;它可以帮助学习者更好地理解编程概念&#xff0c;同时可以进行图形化编程。 …

论文笔记:A review on multi-label learning

一、介绍 传统的监督学习是单标签学习&#xff0c;但是现实中一个实例可能对应多个标签。这篇文章介绍了多标签分类的定义和评价指标、多标签学习的算法还有其他相关的任务。 二、问题相关定义 2.1 多标签学习任务 假设 X R d X R^d XRd&#xff0c;表示d维的输入空间&am…

C# WPF上位机开发(简易图像处理软件)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 图像处理是工业生产重要的环节。不管是定位、测量、检测还是识别&#xff0c;图像处理在工业生产中扮演重要的角色。而c#由于自身快速开发的特点&a…

Python网络爬虫环境的安装指南

网络爬虫是一种自动化的网页数据抓取技术&#xff0c;广泛用于数据挖掘、信息搜集和互联网研究等领域。Python作为一种强大的编程语言&#xff0c;拥有丰富的库支持网络爬虫的开发。本文将为你详细介绍如何在你的计算机上安装Python网络爬虫环境。 一、安装python开发环境 进…

SCUM私人服务器搭建部署教程

以下是搭建SCUM私服的步骤&#xff1a; 1. 下载并安装SteamCMD。SteamCMD是一个命令行工具&#xff0c;用于从Steam下载和更新游戏服务器。你可以从Steam官网下载并安装它。 2. 创建一个文件夹来存储服务器文件。在你的计算机上创建一个文件夹&#xff0c;用于存储SCUM服务器文…

JavaWeb(十二)

一、Filter概述 Filter 表示过滤器&#xff0c;是 JavaWeb 三大组件(Servlet、Filter、Listener)之一。 过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。 如下图所示&#xff0c;浏览器可以访问服务器上的所有的资源&#xff08;servlet、jsp、html等…