一台 Linux 服务器上, 现在要在上面启动 201 个随机占用独立端口的服务, 1-1024 端口不允许使用, 现已经启动了 200 个, 请问第 201 个服务无法启动的概率是多少?
现在的我不会解这题😢 😭 😤 😠
1
HeliumTang 2022-02-27 09:48:45 +08:00 1
(已启动 200+1024 个不允许使用)/ 总端口数
|
2
ryd994 2022-02-27 09:51:12 +08:00 via Android
题干描述不清
随机占用是否包含 1-1024 ? 是否由内核分配?(如是,则无法启动的概率为 0 ) 65535 个端口,减去 1024 个无法使用的,减去 200 个已经占用的,你说纯随机概率是多少? 实际上,如果你 bind 到 0 ,内核会随机给你一个*可用的*端口,上限是 32768 个或 sysctl 设置的范围的一半。为什么不是整个范围,因为内核对于主动请求 bind 的,会分配奇数端口,对于不 bind 直接 connect 的,会分配偶数端口。(哪个是奇数哪个是偶数我忘了,反正各自一半) |
3
plko345 OP |
4
Borden 2022-02-27 10:12:05 +08:00 1
生日碰撞问题嘛,通解搜一下就有
|
6
netnr 2022-02-27 10:24:43 +08:00 via Android
分析一下,当前可用端口数量为 65535-1224=64311 ,在这里面不考虑其他应用程序占用端口的情况,那么就是百分百
|
8
ryd994 2022-02-27 10:43:34 +08:00 via Android
@plko345 这根本不是生日碰撞问题。生日碰撞问题是,有 x 个可用端口,随机抽取 200 次可能重复的端口,其中至少两个端口相同的概率是多少。
你现在这个问题,是已经选取了 200 个已知不重复的端口。问随机抽取 1 个端口,和之前 200 个端口相同的概率是多少。 |
9
whileFalse 2022-02-27 11:49:36 +08:00 1
随机范围是(1024 - 65535],其中 200 个随机位置有大奖,随机抽到大奖的概率是 200/(65535-1024) = 约千分之三
|
10
duke807 2022-02-27 11:52:30 +08:00 via Android
理論上無解,沒有告知 『已经启动了 200 个』之前,系統端口使用情況。服務無法啟動的概率不單是端口被佔用,也有可以代碼有 bug 、內存不夠、硬盤空間等資源不夠,所以概率沒法算。沒錯,我是槓精。
實際上,會衝突的概率為 0 。 |
12
cmdOptionKana 2022-02-27 13:10:46 +08:00
如果这不是数学兴趣题,而是为了解决实际问题的话…… 一般 try 端口 catch 异常换端口即可,根本不用管概率。
|
13
plko345 OP @cmdOptionKana 就是个简单的数学问题
|
14
plko345 OP @cmdOptionKana 应该没人会在一台服务器上起两百多的服务吧
|
15
zmxnv123 2022-02-27 15:43:30 +08:00 via iPhone
说这是生日碰撞问题的怕是没搞懂三门问题。
|