Java 中的生日问题10 Sept 2024 | 5 分钟阅读 生日悖论(或称生日问题)是概率论中的一个概念。虽然它并不构成逻辑矛盾意义上的悖论,但之所以被称为悖论,是因为数学上的现实与常识相悖:大多数人认为概率远低于 50%。它指的是在一个群体中,随机选择两个人,他们有相同生日的可能性。 在一个至少有 23 名随机选择的人组成的群体中,某对个体拥有相同生日的概率大于 50%。对于 57 人或更多的群体,概率超过 99%,而对于 366 人或更多的群体,概率为 100%(根据鸽巢原理,忽略闰年)。生日攻击是一种基于此问题的数学原理的著名密码学攻击。 要使至少两人有相同生日的概率达到 100%,房间里需要有多少人? 回答:367 人(因为有 366 个可能的生日,包括 2 月 29 日)。 上一个问题很简单。请尝试以下问题。 要使至少两人有相同生日的概率达到 50%,房间里需要有多少人? 回答:23 人 令人惊讶的是,这个数字相对较低。实际上,只需 70 位参与者即可达到此概率。 让我们来讨论更广泛的公式。 n 个人中至少有两人有相同生日的概率是多少?设 P 代表 n 个人中至少两人有相同生日的概率(相同)。通过 P(不同),即每个人都有不同生日的概率,可以轻松地估算 P(相同) 与 P(不同) 的关系。 P(相同) = 1 - P(不同) P(不同) 可以写成 1 x (364/365) x (363/365) x (362/365) x.... x (1 - (n-1)/365)。 我们是如何得出上述表达式的? 为了确保每个生日都是唯一的,人们可以按以下顺序获得他们的生日,从第一个到最后一个: 第一个人的生日可以是任何一个(365 种可能性)。 第二个人不应该和第一个人有相同的生日。 第三个人不应该和前面两个人有相同的生日。 ……………. ……………. 第 n 个人应该的生日与之前考虑过的 (n-1) 个人中的任何一个都不同。 上述表达式的特写 使用泰勒级数,上述陈述可以进行近似计算。 对于 x << 1,给出 ex 的一阶近似值 将 x 设置为 -a / 365,以将该近似值应用于为 p(不同) 生成的初始表达式。因此, 上述 p(不同) 的表达式可以写成 1 x (1 - 1/365),1 x (1 - 2/365),1 x (1 - 3/365),1 x.... x (1 - (n-1)/365)。 将 1 - a/365 写成 e-a/365 会得到以下结果。 因此,p(相同) = 1 - p(不同) p 提供了更简单的近似值(相同) 通过在两边取对数,我们可以得到反向公式。 我们可以使用上述近似公式来估计给定概率下需要多少人。例如,Java 中的 find() 函数返回使概率超过指定 p 的最小 n。 在实践中使用近似公式下面的代码提供了特定概率的人数近似值。 文件名:Birthday.java 输出 31.0 复杂度分析 时间复杂度:O(log n) 辅助空间:O(1) 文件名:Birthday1.java 输出 Among the no. of people out of which there is a 0.7 probability that two of them have the same birthdays is 1 时间复杂度:O(log n) 辅助空间:O(1) 任务计算一个群体至少需要多少独立成员,才能使至少两名成员拥有相同生日的概率大于 50%。此外:计算模拟,以确定当群体中有至少 3、4 和 5 名独立成员拥有相同生日的概率大于 50% 时的情况。为了简单起见,我们假设所有人都还活着。 改进建议
文件名:Birthday1.java 输出 In a group of 23 people 2 independent people share a common birthday. ( 50.6) In a group of 87 people 3 independent people share a common birthday. ( 50.4) In a group of 187 people 4 independent people share a common birthday. ( 50.1) In a group of 314 people 5 independent people share a common birthday. ( 50.2) 应用
|
在 Java 中处理多线程应用程序时,有效管理线程优先级至关重要。为线程设置优先级可以帮助我们控制操作系统如何调度线程进行执行。Java 提供了一个名为 setPriority() 的方法来设置线程的优先级,允许我们...
阅读9分钟
反转字符串中的字符会将每个字母替换为其在字母表中对应位置的对应字符(例如,'a' 变为 'z','b' 变为 'y')。大写和小写字母保留其大小写,非字母字符保持不变。此技术在编码和文本转换中很有用。示例...
7 分钟阅读
在二叉树中,节点与其祖先之间的最大差值是祖先节点减去其后代节点值所能达到的最高值。节点的祖先是沿从根节点到该节点的路径上的任何节点...
5 分钟阅读
我们的主要关注点是元音集,因为元音集对于许多字符串操作问题通常很重要,其中一个问题是识别包含 K 个不同元音的给定字符串的最长子字符串。这个问题...
阅读 6 分钟
在 Java 中,有多种方法可以检索日期范围。最常见的选择是使用 Java 标准库中的内置类,例如 LocalDate 类,或者第三方库,例如 Joda-Time 或 Java 8 中引入的较新的 Java Time API...
阅读 4 分钟
Java 中的链表中大于节点给定一个整数链表 L,任务是返回一个包含提供的链表中每个元素更大元素的整数链表。如果没有元素更大...
阅读 6 分钟
交换两个变量是编程中的常见任务,通常涉及三个步骤:将一个变量的值存储到临时变量中,将第二个变量的值赋给第一个变量,然后将临时变量的值赋给第二个变量。然而,在某些编程语言中,...
阅读 4 分钟
Java 8 带来了海量的新特性,彻底改变了开发人员编写代码的方式。在这些增强功能中,字符串操作和连接方面的改进尤其值得注意。通过引入 StringJoiner、String.join() 和 Collectors.joining(),Java 8 使开发人员能够创建高效且优雅的解决方案...
阅读 4 分钟
在软件开发领域,文本处理是一项常见任务。无论我们是构建搜索引擎、聊天机器人还是任何处理文本的应用程序,我们可能都需要确定字符串中是否存在某些单词。在本节中,我们……
阅读 8 分钟
Java.util.concurrent.atomic.AtomicLongArray.set() 是一个内置的 Java 方法,允许您在 AtomicLongArray 中的任何位置设置值。此函数接受 AtomicLongArray 的索引值作为参数,从而修改该索引处的值。此方法不返回任何内容...
阅读 3 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India