请教一个高中生就会的简单数学题

2022-02-27 09:42:20 +08:00
 plko345

一台 Linux 服务器上, 现在要在上面启动 201 个随机占用独立端口的服务, 1-1024 端口不允许使用, 现已经启动了 200 个, 请问第 201 个服务无法启动的概率是多少?

现在的我不会解这题😢 😭 😤 😠

2898 次点击
所在节点    数学
15 条回复
HeliumTang
2022-02-27 09:48:45 +08:00
(已启动 200+1024 个不允许使用)/ 总端口数
ryd994
2022-02-27 09:51:12 +08:00
题干描述不清
随机占用是否包含 1-1024 ?
是否由内核分配?(如是,则无法启动的概率为 0 )
65535 个端口,减去 1024 个无法使用的,减去 200 个已经占用的,你说纯随机概率是多少?

实际上,如果你 bind 到 0 ,内核会随机给你一个*可用的*端口,上限是 32768 个或 sysctl 设置的范围的一半。为什么不是整个范围,因为内核对于主动请求 bind 的,会分配奇数端口,对于不 bind 直接 connect 的,会分配偶数端口。(哪个是奇数哪个是偶数我忘了,反正各自一半)
plko345
2022-02-27 10:04:01 +08:00
@HeliumTang 真的是这样算吗?


@ryd994 我理解应该是 65535 - 1024 的剩余端口随机分配, 应该不会有那么复杂的背后潜规则
Borden
2022-02-27 10:12:05 +08:00
生日碰撞问题嘛,通解搜一下就有
plko345
2022-02-27 10:17:47 +08:00
@Borden "生日碰撞" 就是这个, 我想起了数学老师
netnr
2022-02-27 10:24:43 +08:00
分析一下,当前可用端口数量为 65535-1224=64311 ,在这里面不考虑其他应用程序占用端口的情况,那么就是百分百
plko345
2022-02-27 10:35:15 +08:00
@netnr 题目里的随机应该是指有概率与已占用的 200 个端口冲突
ryd994
2022-02-27 10:43:34 +08:00
@plko345 这根本不是生日碰撞问题。生日碰撞问题是,有 x 个可用端口,随机抽取 200 次可能重复的端口,其中至少两个端口相同的概率是多少。


你现在这个问题,是已经选取了 200 个已知不重复的端口。问随机抽取 1 个端口,和之前 200 个端口相同的概率是多少。
whileFalse
2022-02-27 11:49:36 +08:00
随机范围是(1024 - 65535],其中 200 个随机位置有大奖,随机抽到大奖的概率是 200/(65535-1024) = 约千分之三
duke807
2022-02-27 11:52:30 +08:00
理論上無解,沒有告知 『已经启动了 200 个』之前,系統端口使用情況。服務無法啟動的概率不單是端口被佔用,也有可以代碼有 bug 、內存不夠、硬盤空間等資源不夠,所以概率沒法算。沒錯,我是槓精。

實際上,會衝突的概率為 0 。
plko345
2022-02-27 12:59:02 +08:00
@ryd994 我觉得你是对的。。。
cmdOptionKana
2022-02-27 13:10:46 +08:00
如果这不是数学兴趣题,而是为了解决实际问题的话…… 一般 try 端口 catch 异常换端口即可,根本不用管概率。
plko345
2022-02-27 14:57:21 +08:00
@cmdOptionKana 就是个简单的数学问题
plko345
2022-02-27 14:58:18 +08:00
@cmdOptionKana 应该没人会在一台服务器上起两百多的服务吧
zmxnv123
2022-02-27 15:43:30 +08:00
说这是生日碰撞问题的怕是没搞懂三门问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/836671

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX