mirror of https://github.com/by-sonic/tglock.git
v0.3.0: Fix DC detection from obfuscated2 init, use kws endpoints
Made-with: Cursor:
This commit is contained in:
parent
aff6bb6f35
commit
fd9e2351c3
|
|
@ -1,6 +1,6 @@
|
|||
[package]
|
||||
name = "tg_unblock"
|
||||
version = "0.2.0"
|
||||
version = "0.3.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
|
|
@ -14,6 +14,9 @@ open = "5"
|
|||
tokio-tungstenite = { version = "0.24", features = ["native-tls"] }
|
||||
native-tls = "0.2"
|
||||
futures-util = "0.3"
|
||||
aes = "0.8"
|
||||
ctr = "0.9"
|
||||
cipher = "0.4"
|
||||
|
||||
[target.'cfg(windows)'.dependencies]
|
||||
winapi = { version = "0.3", features = ["winuser"] }
|
||||
|
|
|
|||
173
src/ws_proxy.rs
173
src/ws_proxy.rs
|
|
@ -36,7 +36,6 @@ pub async fn run_proxy(port: u16, stats: Arc<ProxyStats>) -> Result<(), String>
|
|||
if !stats.running.load(Ordering::SeqCst) {
|
||||
break;
|
||||
}
|
||||
|
||||
tokio::select! {
|
||||
result = listener.accept() => {
|
||||
if let Ok((stream, _)) = result {
|
||||
|
|
@ -57,25 +56,77 @@ pub async fn run_proxy(port: u16, stats: Arc<ProxyStats>) -> Result<(), String>
|
|||
Ok(())
|
||||
}
|
||||
|
||||
/// DC name mapping from official Telegram MTProto transport docs
|
||||
fn dc_ws_url(dc: u8) -> String {
|
||||
let name = match dc {
|
||||
1 => "pluto",
|
||||
2 => "venus",
|
||||
3 => "aurora",
|
||||
4 => "vesta",
|
||||
5 => "flora",
|
||||
_ => "venus",
|
||||
};
|
||||
format!("wss://{}.web.telegram.org/apiws", name)
|
||||
// ---------------------------------------------------------------------------
|
||||
// DC extraction from obfuscated2 init packet (same method as tg-ws-proxy)
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
fn extract_dc_from_init(init: &[u8; 64]) -> Option<u8> {
|
||||
use aes::Aes256;
|
||||
use cipher::{KeyIvInit, StreamCipher};
|
||||
type Aes256Ctr = ctr::Ctr128BE<Aes256>;
|
||||
|
||||
let key = &init[8..40];
|
||||
let iv = &init[40..56];
|
||||
|
||||
let mut dec = [0u8; 64];
|
||||
dec.copy_from_slice(init);
|
||||
|
||||
let mut cipher = Aes256Ctr::new(key.into(), iv.into());
|
||||
cipher.apply_keystream(&mut dec);
|
||||
|
||||
let dc_id = i32::from_le_bytes([dec[60], dec[61], dec[62], dec[63]]);
|
||||
let dc = dc_id.unsigned_abs() as u8;
|
||||
if (1..=5).contains(&dc) {
|
||||
Some(dc)
|
||||
} else {
|
||||
None
|
||||
}
|
||||
}
|
||||
|
||||
fn dc_from_ip(ip: Ipv4Addr) -> Option<u8> {
|
||||
let o = ip.octets();
|
||||
match (o[0], o[1]) {
|
||||
(149, 154) => Some(match o[2] {
|
||||
160..=163 => 1,
|
||||
164..=167 => 2,
|
||||
168..=171 => 3,
|
||||
172..=175 => 1,
|
||||
_ => 2,
|
||||
}),
|
||||
(91, 108) => Some(match o[2] {
|
||||
56..=59 => 5,
|
||||
8..=11 => 3,
|
||||
12..=15 => 4,
|
||||
_ => 2,
|
||||
}),
|
||||
(91, 105) | (185, 76) => Some(2),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
|
||||
fn is_telegram_ip(addr: &str) -> bool {
|
||||
addr.parse::<Ipv4Addr>()
|
||||
.ok()
|
||||
.and_then(dc_from_ip)
|
||||
.is_some()
|
||||
}
|
||||
|
||||
/// Endpoint format used by the proven tg-ws-proxy project
|
||||
fn ws_url(dc: u8) -> String {
|
||||
format!("wss://kws{}.web.telegram.org/apiws", dc)
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// SOCKS5 handler
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
async fn handle_socks5(
|
||||
mut stream: TcpStream,
|
||||
stats: &ProxyStats,
|
||||
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||
stream.set_nodelay(true)?;
|
||||
|
||||
// --- auth negotiation ---
|
||||
let mut buf = [0u8; 258];
|
||||
let n = stream.read(&mut buf).await?;
|
||||
if n < 2 || buf[0] != 0x05 {
|
||||
|
|
@ -83,6 +134,7 @@ async fn handle_socks5(
|
|||
}
|
||||
stream.write_all(&[0x05, 0x00]).await?;
|
||||
|
||||
// --- CONNECT request ---
|
||||
let n = stream.read(&mut buf).await?;
|
||||
if n < 7 || buf[0] != 0x05 || buf[1] != 0x01 {
|
||||
stream.write_all(&[0x05, 0x07, 0x00, 0x01, 0, 0, 0, 0, 0, 0]).await?;
|
||||
|
|
@ -90,38 +142,47 @@ async fn handle_socks5(
|
|||
}
|
||||
|
||||
let (dest_addr, dest_port) = parse_dest(&buf[3..n])?;
|
||||
let is_tg = is_telegram_ip(&dest_addr);
|
||||
|
||||
let dc = dest_addr
|
||||
.parse::<Ipv4Addr>()
|
||||
.ok()
|
||||
.and_then(telegram_dc);
|
||||
// SOCKS5 success (we handle the connection ourselves)
|
||||
stream
|
||||
.write_all(&[0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x04, 0x38])
|
||||
.await?;
|
||||
|
||||
if let Some(dc_id) = dc {
|
||||
stream
|
||||
.write_all(&[0x05, 0x00, 0x00, 0x01, 127, 0, 0, 1, 0x04, 0x38])
|
||||
.await?;
|
||||
if is_tg {
|
||||
// Read the first 64 bytes — obfuscated2 init packet
|
||||
let mut init = [0u8; 64];
|
||||
stream.read_exact(&mut init).await?;
|
||||
|
||||
// Extract DC from init packet (primary), fall back to IP-based
|
||||
let dc = extract_dc_from_init(&init).unwrap_or_else(|| {
|
||||
dest_addr
|
||||
.parse::<Ipv4Addr>()
|
||||
.ok()
|
||||
.and_then(dc_from_ip)
|
||||
.unwrap_or(2)
|
||||
});
|
||||
|
||||
stats.ws_active.fetch_add(1, Ordering::Relaxed);
|
||||
let result = relay_via_ws(stream, dc_id).await;
|
||||
|
||||
// Try WebSocket tunnel; fall back to direct TCP on failure
|
||||
let ws_result = relay_via_ws(stream, dc, &init).await;
|
||||
|
||||
stats.ws_active.fetch_sub(1, Ordering::Relaxed);
|
||||
|
||||
if let Err(e) = result {
|
||||
return Err(format!("WS tunnel DC{}: {}", dc_id, e).into());
|
||||
if let Err(e) = ws_result {
|
||||
return Err(format!("DC{} tunnel: {}", dc, e).into());
|
||||
}
|
||||
} else {
|
||||
// Non-Telegram — direct TCP passthrough
|
||||
let target = format!("{}:{}", dest_addr, dest_port);
|
||||
match TcpStream::connect(&target).await {
|
||||
Ok(remote) => {
|
||||
let _ = remote.set_nodelay(true);
|
||||
stream
|
||||
.write_all(&[0x05, 0x00, 0x00, 0x01, 0, 0, 0, 0, 0, 0])
|
||||
.await?;
|
||||
relay_tcp(stream, remote).await;
|
||||
}
|
||||
Err(_) => {
|
||||
stream
|
||||
.write_all(&[0x05, 0x05, 0x00, 0x01, 0, 0, 0, 0, 0, 0])
|
||||
.await?;
|
||||
Err(e) => {
|
||||
return Err(format!("TCP connect {}: {}", target, e).into());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -160,62 +221,42 @@ fn parse_dest(data: &[u8]) -> Result<(String, u16), Box<dyn std::error::Error +
|
|||
}
|
||||
}
|
||||
|
||||
fn telegram_dc(ip: Ipv4Addr) -> Option<u8> {
|
||||
let o = ip.octets();
|
||||
match (o[0], o[1]) {
|
||||
(149, 154) => Some(match o[2] {
|
||||
160..=163 => 1,
|
||||
164..=167 => 2,
|
||||
168..=171 => 3,
|
||||
172..=175 => 1,
|
||||
_ => 2,
|
||||
}),
|
||||
(91, 108) => Some(match o[2] {
|
||||
56..=59 => 5,
|
||||
8..=11 => 3,
|
||||
12..=15 => 4,
|
||||
_ => 2,
|
||||
}),
|
||||
(91, 105) => Some(2),
|
||||
(185, 76) => Some(2),
|
||||
_ => None,
|
||||
}
|
||||
}
|
||||
// ---------------------------------------------------------------------------
|
||||
// WebSocket tunnel — reads init first, then relays
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
async fn relay_via_ws(
|
||||
tcp_stream: TcpStream,
|
||||
dc_id: u8,
|
||||
dc: u8,
|
||||
init: &[u8; 64],
|
||||
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
|
||||
use futures_util::{SinkExt, StreamExt};
|
||||
|
||||
let ws_url = dc_ws_url(dc_id);
|
||||
let mut request = ws_url.as_str().into_client_request()?;
|
||||
let url = ws_url(dc);
|
||||
let mut request = url.as_str().into_client_request()?;
|
||||
|
||||
// Required by the Telegram WebSocket transport protocol
|
||||
request.headers_mut().insert(
|
||||
"Sec-WebSocket-Protocol",
|
||||
"binary".parse()?,
|
||||
);
|
||||
request.headers_mut().insert(
|
||||
"Origin",
|
||||
"https://web.telegram.org".parse()?,
|
||||
);
|
||||
request
|
||||
.headers_mut()
|
||||
.insert("Sec-WebSocket-Protocol", "binary".parse()?);
|
||||
|
||||
let connector = tokio_tungstenite::Connector::NativeTls(
|
||||
native_tls::TlsConnector::new().map_err(|e| format!("TLS: {}", e))?,
|
||||
);
|
||||
|
||||
let (ws, _resp) = tokio_tungstenite::connect_async_tls_with_config(
|
||||
request,
|
||||
None,
|
||||
false,
|
||||
Some(connector),
|
||||
request, None, false, Some(connector),
|
||||
)
|
||||
.await?;
|
||||
|
||||
let (mut ws_tx, mut ws_rx) = ws.split();
|
||||
let (mut tcp_rx, mut tcp_tx) = tokio::io::split(tcp_stream);
|
||||
|
||||
// Send the buffered 64-byte init as the first WebSocket message
|
||||
ws_tx
|
||||
.send(tungstenite::Message::Binary(init.to_vec()))
|
||||
.await?;
|
||||
|
||||
let up = async {
|
||||
let mut buf = vec![0u8; 32768];
|
||||
loop {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,418 @@
|
|||
# Решения задач по теории вероятностей
|
||||
## Формулы Бернулли, местная и интегральная теоремы Муавра–Лапласа, формула Пуассона
|
||||
|
||||
---
|
||||
|
||||
## Задача 3
|
||||
|
||||
**Условие:** В среднем каждое второе малое предприятие имеет нарушение финансовой дисциплины. Из **n = 1000** предприятий найти вероятность того, что нарушения имеют:
|
||||
|
||||
Дано: n = 1000, p = 1/2 = 0,5, q = 0,5
|
||||
npq = 1000 · 0,5 · 0,5 = 250, √(npq) = √250 ≈ 15,81
|
||||
|
||||
---
|
||||
|
||||
### а) Ровно 480 предприятий
|
||||
|
||||
Используем **местную теорему Муавра–Лапласа**:
|
||||
|
||||
$$P_n(k) \approx \frac{1}{\sqrt{npq}} \cdot \varphi(x), \quad x = \frac{k - np}{\sqrt{npq}}$$
|
||||
|
||||
$$x = \frac{480 - 500}{15{,}81} = \frac{-20}{15{,}81} \approx -1{,}26$$
|
||||
|
||||
φ(1,26) = 0,1826 (по таблице функции Гаусса)
|
||||
|
||||
$$P_{1000}(480) \approx \frac{0{,}1826}{15{,}81} \approx \mathbf{0{,}0116}$$
|
||||
|
||||
---
|
||||
|
||||
### б) Наивероятнейшее число предприятий
|
||||
|
||||
По формуле: **np − q ≤ k₀ ≤ np + p**
|
||||
|
||||
499,5 ≤ k₀ ≤ 500,5 → **k₀ = 500**
|
||||
|
||||
---
|
||||
|
||||
### в) Не менее 480 предприятий
|
||||
|
||||
Используем **интегральную теорему Муавра–Лапласа**:
|
||||
|
||||
$$P(k \geq 480) = 0{,}5 + \Phi\!\left(\frac{np - k_1}{\sqrt{npq}}\right)$$
|
||||
|
||||
$$= 0{,}5 + \Phi(1{,}26) = 0{,}5 + 0{,}3962 \approx \mathbf{0{,}8962}$$
|
||||
|
||||
---
|
||||
|
||||
### г) От 480 до 520 предприятий
|
||||
|
||||
$$x_1 = \frac{480 - 500}{15{,}81} \approx -1{,}26, \quad x_2 = \frac{520 - 500}{15{,}81} \approx 1{,}26$$
|
||||
|
||||
$$P(480 \leq k \leq 520) = \Phi(1{,}26) - \Phi(-1{,}26) = 2\Phi(1{,}26) = 2 \cdot 0{,}3962 \approx \mathbf{0{,}7924}$$
|
||||
|
||||
---
|
||||
|
||||
## Задача 4
|
||||
|
||||
**Условие:** Вероятность банкротства предприятия за время t равна 0,2. Из **n = 6** предприятий найти вероятность того, что **сохранятся**:
|
||||
|
||||
Дано: n = 6, p(сохранится) = 1 − 0,2 = **0,8**, q = 0,2
|
||||
|
||||
Используем **формулу Бернулли**: P_n(k) = C(n,k) · pᵏ · qⁿ⁻ᵏ
|
||||
|
||||
---
|
||||
|
||||
### а) Два предприятия (k = 2)
|
||||
|
||||
$$P_6(2) = C_6^2 \cdot (0{,}8)^2 \cdot (0{,}2)^4 = 15 \cdot 0{,}64 \cdot 0{,}0016 = \mathbf{0{,}0154}$$
|
||||
|
||||
---
|
||||
|
||||
### б) Более двух предприятий (k > 2)
|
||||
|
||||
$$P(k > 2) = 1 - P(k \leq 2) = 1 - [P(0) + P(1) + P(2)]$$
|
||||
|
||||
- P₆(0) = C(6,0) · (0,8)⁰ · (0,2)⁶ = 1 · 1 · 0,000064 = 0,000064
|
||||
- P₆(1) = C(6,1) · (0,8)¹ · (0,2)⁵ = 6 · 0,8 · 0,00032 = 0,001536
|
||||
- P₆(2) = 0,0154 (вычислено выше)
|
||||
|
||||
$$P(k > 2) = 1 - (0{,}000064 + 0{,}001536 + 0{,}0154) \approx 1 - 0{,}0170 = \mathbf{0{,}983}$$
|
||||
|
||||
---
|
||||
|
||||
## Задача 5
|
||||
|
||||
**Условие:** В банк отправлено **n = 4000** пакетов. Вероятность ошибки в комплектации **p = 0,0001**. Найти вероятность обнаружения:
|
||||
|
||||
λ = np = 4000 · 0,0001 = **0,4**
|
||||
|
||||
Используем **формулу Пуассона**: P(k) = (λᵏ / k!) · e⁻λ
|
||||
|
||||
e⁻⁰·⁴ ≈ 0,6703
|
||||
|
||||
---
|
||||
|
||||
### а) Три ошибочно укомплектованных пакета (k = 3)
|
||||
|
||||
$$P(3) = \frac{(0{,}4)^3}{3!} \cdot e^{-0{,}4} = \frac{0{,}064}{6} \cdot 0{,}6703 \approx \mathbf{0{,}00715}$$
|
||||
|
||||
---
|
||||
|
||||
### б) Не более трёх пакетов (k ≤ 3)
|
||||
|
||||
$$P(k \leq 3) = P(0) + P(1) + P(2) + P(3)$$
|
||||
|
||||
- P(0) = e⁻⁰·⁴ = 0,6703
|
||||
- P(1) = 0,4 · e⁻⁰·⁴ = 0,2681
|
||||
- P(2) = (0,4²/2) · e⁻⁰·⁴ = 0,0536
|
||||
- P(3) = 0,00715
|
||||
|
||||
$$P(k \leq 3) = 0{,}6703 + 0{,}2681 + 0{,}0536 + 0{,}00715 \approx \mathbf{0{,}9992}$$
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Домашняя работа
|
||||
|
||||
---
|
||||
|
||||
## Задача 1 (ДЗ)
|
||||
|
||||
**Условие:** Вероятность попадания в цель р = 0,7. Из **n = 80** выстрелов — найти вероятность различных исходов.
|
||||
|
||||
Дано: n = 80, p = 0,7, q = 0,3
|
||||
np = 56, npq = 16,8, √(npq) ≈ 4,10
|
||||
|
||||
---
|
||||
|
||||
### а) Ровно 75 попаданий
|
||||
|
||||
$$x = \frac{75 - 56}{4{,}10} \approx 4{,}63$$
|
||||
|
||||
φ(4,63) ≈ 0,00002 (крайне малое значение)
|
||||
|
||||
$$P_{80}(75) \approx \frac{0{,}00002}{4{,}10} \approx \mathbf{0{,}000005} \approx 0$$
|
||||
|
||||
---
|
||||
|
||||
### б) Не менее 75 попаданий
|
||||
|
||||
$$x_1 = \frac{75 - 56}{4{,}10} \approx 4{,}63$$
|
||||
|
||||
$$P(k \geq 75) = 0{,}5 - \Phi(4{,}63) \approx 0{,}5 - 0{,}5 \approx \mathbf{0}$$
|
||||
|
||||
---
|
||||
|
||||
### в) Менее 75 попаданий
|
||||
|
||||
$$P(k < 75) = 1 - P(k \geq 75) \approx \mathbf{1}$$
|
||||
|
||||
---
|
||||
|
||||
### г) Не более 75 попаданий
|
||||
|
||||
$$P(k \leq 75) = P(k < 75) + P(k = 75) \approx 1 + 0 \approx \mathbf{1}$$
|
||||
|
||||
---
|
||||
|
||||
### д) Более 75 попаданий
|
||||
|
||||
$$P(k > 75) \approx \mathbf{0}$$
|
||||
|
||||
---
|
||||
|
||||
### е) Все 80 выстрелов
|
||||
|
||||
$$P_{80}(80) = (0{,}7)^{80} = e^{80 \ln 0{,}7} = e^{-28{,}5} \approx \mathbf{4{,}4 \times 10^{-13}}$$
|
||||
|
||||
---
|
||||
|
||||
## Задача 2 (ДЗ)
|
||||
|
||||
**Условие:** Вероятность выпуска сверла с браком p = 0,02. Сверла укладываются по 100 штук. Найти наименьшее количество добавочных сверл, чтобы с вероятностью **не менее 0,9** в коробке было **не менее 100 исправных**.
|
||||
|
||||
Пусть в коробке **n** сверл, p(исправное) = 0,98. Нужно: P(X ≥ 100) ≥ 0,9
|
||||
|
||||
$$P(X \geq 100) = 0{,}5 + \Phi\!\left(\frac{np - 100}{\sqrt{np \cdot 0{,}02}}\right) \geq 0{,}9$$
|
||||
|
||||
$$\Rightarrow \frac{0{,}98n - 100}{0{,}14\sqrt{n}} \geq 1{,}28$$
|
||||
|
||||
Подстановка t = √n: 0,98t² − 0,1792t − 100 ≥ 0
|
||||
|
||||
$$t = \frac{0{,}1792 + \sqrt{0{,}1792^2 + 4 \cdot 0{,}98 \cdot 100}}{2 \cdot 0{,}98} = \frac{0{,}179 + 19{,}80}{1{,}96} \approx 10{,}19$$
|
||||
|
||||
$$n \geq (10{,}19)^2 \approx 103{,}9 \Rightarrow n = 104$$
|
||||
|
||||
**Ответ:** нужно добавить **m = 104 − 100 = 4 сверла**
|
||||
|
||||
---
|
||||
|
||||
## Задача 3 (ДЗ)
|
||||
|
||||
**Условие:** Сколько изюминок в среднем должна содержать булочка, чтобы вероятность хотя бы одной изюминки была **не менее 0,99**?
|
||||
|
||||
Используем формулу Пуассона: P(X ≥ 1) = 1 − P(X = 0) = 1 − e⁻λ ≥ 0,99
|
||||
|
||||
$$e^{-\lambda} \leq 0{,}01 \Rightarrow \lambda \geq -\ln(0{,}01) = \ln 100 \approx 4{,}61$$
|
||||
|
||||
**Ответ:** в среднем в булочке должно быть **не менее 5 изюминок** (λ ≥ 4,61)
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Задача (Картофель)
|
||||
|
||||
**Условие:** В складе 20% клубней с пятнами. Отобрано **n = 9** клубней. p(без пятен) = 0,8, q = 0,2.
|
||||
|
||||
---
|
||||
|
||||
### а) Наивероятнейшее число клубней без пятен
|
||||
|
||||
np − q ≤ k₀ ≤ np + p
|
||||
9·0,8 − 0,2 ≤ k₀ ≤ 9·0,8 + 0,8
|
||||
**7,0 ≤ k₀ ≤ 8,0**
|
||||
|
||||
Так как оба конца — целые числа, оба значения k₀ = 7 и k₀ = 8 являются наивероятнейшими (с одинаковой вероятностью).
|
||||
|
||||
---
|
||||
|
||||
### б) Вероятность наивероятнейшего числа
|
||||
|
||||
$$P_9(7) = C_9^7 \cdot (0{,}8)^7 \cdot (0{,}2)^2 = 36 \cdot 0{,}2097 \cdot 0{,}04 \approx \mathbf{0{,}302}$$
|
||||
|
||||
$$P_9(8) = C_9^8 \cdot (0{,}8)^8 \cdot (0{,}2)^1 = 9 \cdot 0{,}1678 \cdot 0{,}2 \approx \mathbf{0{,}302}$$
|
||||
|
||||
P(7) = P(8) ≈ **0,302** — подтверждает, что оба значения равновероятны
|
||||
|
||||
---
|
||||
|
||||
## Задача (Событие А, k₀ = 20)
|
||||
|
||||
**Условие:** Вероятность события А в каждом испытании p = 0,7. Сколько испытаний нужно провести, чтобы **наивероятнейшее число** равнялось **20**?
|
||||
|
||||
np − q ≤ k₀ ≤ np + p, то есть при k₀ = 20:
|
||||
|
||||
$$0{,}7n - 0{,}3 \leq 20 \leq 0{,}7n + 0{,}7$$
|
||||
|
||||
Из левого неравенства: 0,7n ≤ 20,3 → **n ≤ 29**
|
||||
|
||||
Из правого неравенства: 0,7n ≥ 19,3 → **n ≥ 27,57 → n ≥ 28**
|
||||
|
||||
Проверка:
|
||||
- n = 28: np−q = 19,3, np+p = 20,3 → единственное целое k₀ = **20** ✓
|
||||
- n = 29: np−q = 20,0, np+p = 21,0 → k₀ = 20 или 21 (два наивероятнейших)
|
||||
|
||||
**Ответ: n = 28** (или n = 29, если допустимо два наивероятнейших значения)
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Задача 1 (Лотерея)
|
||||
|
||||
**Условие:** Вероятность выигрыша по одному билету p = 1/7. Имея **n = 7** билетов, найти вероятность выигрыша:
|
||||
|
||||
Используем **формулу Бернулли**
|
||||
|
||||
---
|
||||
|
||||
### а) По двум билетам (k = 2)
|
||||
|
||||
$$P_7(2) = C_7^2 \cdot \left(\frac{1}{7}\right)^2 \cdot \left(\frac{6}{7}\right)^5 = 21 \cdot \frac{1}{49} \cdot \frac{7776}{16807} = \frac{163296}{823543} \approx \mathbf{0{,}198}$$
|
||||
|
||||
---
|
||||
|
||||
### б) По трём билетам (k = 3)
|
||||
|
||||
$$P_7(3) = C_7^3 \cdot \left(\frac{1}{7}\right)^3 \cdot \left(\frac{6}{7}\right)^4 = 35 \cdot \frac{1}{343} \cdot \frac{1296}{2401} = \frac{45360}{823543} \approx \mathbf{0{,}055}$$
|
||||
|
||||
---
|
||||
|
||||
## Задача 2 (Мята, гербициды)
|
||||
|
||||
**Условие:** Повреждены гербицидами 15% растений мяты. Отобрано **n = 20** растений. p = 0,15, q = 0,85.
|
||||
|
||||
np − q ≤ k₀ ≤ np + p
|
||||
3 − 0,85 ≤ k₀ ≤ 3 + 0,15
|
||||
2,15 ≤ k₀ ≤ 3,15
|
||||
|
||||
**k₀ = 3** — наивероятнейшее число повреждённых растений
|
||||
|
||||
---
|
||||
|
||||
## Задача 3 (Сбербанк)
|
||||
|
||||
**Условие:** Два филиала. Филиал 1: n₁ = 120, p₁ = 0,94. Филиал 2: n₂ = 140, p₂ = 0,8. Найти наивероятнейшее число клиентов, снявших деньги.
|
||||
|
||||
**Филиал 1:** np₁ = 112,8; np₁ − q₁ = 112,74; np₁ + p₁ = 113,74 → **k₀₁ = 113**
|
||||
|
||||
**Филиал 2:** np₂ = 112,0; np₂ − q₂ = 111,8; np₂ + p₂ = 112,8 → **k₀₂ = 112**
|
||||
|
||||
**Ответ:** Первый филиал обслуживает больше клиентов, снявших деньги: **113 > 112**
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Задача (Событие А, 400 испытаний)
|
||||
|
||||
**Условие:** Найти вероятность того, что событие А наступит **ровно 80 раз** в 400 испытаниях, если p = 0,2.
|
||||
|
||||
Дано: n = 400, k = 80, p = 0,2, q = 0,8
|
||||
np = 80, npq = 64, √(npq) = 8
|
||||
|
||||
$$x = \frac{k - np}{\sqrt{npq}} = \frac{80 - 80}{8} = 0$$
|
||||
|
||||
$$\varphi(0) = \frac{1}{\sqrt{2\pi}} \approx 0{,}3989$$
|
||||
|
||||
$$P_{400}(80) \approx \frac{\varphi(0)}{\sqrt{npq}} = \frac{0{,}3989}{8} \approx \mathbf{0{,}0499}$$
|
||||
|
||||
---
|
||||
|
||||
## Задача (Стрелок)
|
||||
|
||||
**Условие:** Вероятность поражения мишени p = 0,75. При **n = 10** выстрелах найти вероятность **ровно 8 попаданий**.
|
||||
|
||||
$$P_{10}(8) = C_{10}^8 \cdot (0{,}75)^8 \cdot (0{,}25)^2$$
|
||||
|
||||
$$= 45 \cdot \frac{6561}{65536} \cdot \frac{1}{16} = \frac{295245}{1048576} \approx \mathbf{0{,}2816}$$
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Задача (Кинескопы — Интегральная теорема Лапласа)
|
||||
|
||||
**Условие:** 12% кинескопов не проработают гарантийный срок. Из **n = 50** наугад выбранных — найти вероятность того, что проработают гарантийный срок:
|
||||
|
||||
Дано: n = 50, p(проработает) = 1 − 0,12 = **0,88**, q = 0,12
|
||||
np = 44, npq = 50 · 0,88 · 0,12 = 5,28, √(npq) ≈ 2,298
|
||||
|
||||
---
|
||||
|
||||
### а) Ровно 47 кинескопов
|
||||
|
||||
Местная теорема:
|
||||
|
||||
$$x = \frac{47 - 44}{2{,}298} \approx 1{,}305, \quad \varphi(1{,}305) \approx 0{,}1714$$
|
||||
|
||||
$$P_{50}(47) \approx \frac{0{,}1714}{2{,}298} \approx \mathbf{0{,}0745}$$
|
||||
|
||||
---
|
||||
|
||||
### б) Не менее 47 кинескопов
|
||||
|
||||
$$x_1 = \frac{47 - 44}{2{,}298} \approx 1{,}305$$
|
||||
|
||||
$$P(k \geq 47) \approx 0{,}5 - \Phi(1{,}305) = 0{,}5 - 0{,}4040 \approx \mathbf{0{,}0960}$$
|
||||
|
||||
---
|
||||
|
||||
### в) Менее 47 кинескопов
|
||||
|
||||
$$P(k < 47) = 1 - P(k \geq 47) \approx 1 - 0{,}0960 = \mathbf{0{,}9040}$$
|
||||
|
||||
---
|
||||
|
||||
### г) Более 47 кинескопов
|
||||
|
||||
$$x = \frac{48 - 44}{2{,}298} \approx 1{,}740$$
|
||||
|
||||
$$P(k > 47) = P(k \geq 48) \approx 0{,}5 - \Phi(1{,}74) = 0{,}5 - 0{,}4591 \approx \mathbf{0{,}0409}$$
|
||||
|
||||
---
|
||||
|
||||
### д) Не более 47 кинескопов
|
||||
|
||||
$$P(k \leq 47) = 1 - P(k > 47) \approx 1 - 0{,}0409 = \mathbf{0{,}9591}$$
|
||||
|
||||
---
|
||||
|
||||
### е) Все 50 кинескопов
|
||||
|
||||
$$P_{50}(50) = (0{,}88)^{50} \approx \mathbf{0{,}00167}$$
|
||||
|
||||
(Для проверки по местной теореме: x = (50−44)/2,298 ≈ 2,61; φ(2,61) ≈ 0,0136; P ≈ 0,006 — приближение менее точно из-за удалённости от центра)
|
||||
|
||||
---
|
||||
|
||||
---
|
||||
|
||||
## Домашнее задание (Интегральная теорема Лапласа)
|
||||
|
||||
---
|
||||
|
||||
## Задача 1 (ДЗ — Новорождённые)
|
||||
|
||||
**Условие:** Среди **n = 1000** новорождённых. Вероятность рождения мальчика p = 0,51. Найти вероятность того, что мальчиков будет:
|
||||
|
||||
np = 510, npq = 1000 · 0,51 · 0,49 = 249,9, √(npq) ≈ 15,81
|
||||
|
||||
---
|
||||
|
||||
### а) Не менее половины (m ≥ 500)
|
||||
|
||||
$$x_1 = \frac{500 - 510}{15{,}81} \approx -0{,}63, \quad x_2 \to +\infty$$
|
||||
|
||||
$$P_{1000}(500 \leq m \leq 1000) \approx \Phi(+\infty) - \Phi(-0{,}63) = 0{,}5 - (-0{,}2357) = \mathbf{0{,}7357}$$
|
||||
|
||||
---
|
||||
|
||||
### б) Менее половины (m < 500, то есть m ≤ 499)
|
||||
|
||||
$$P_{1000}(0 \leq m \leq 499) = 1 - 0{,}7357 = \mathbf{0{,}2643}$$
|
||||
|
||||
---
|
||||
|
||||
## Задача 2 (ДЗ — Картофель при уборке)
|
||||
|
||||
**Условие:** При уборке повреждается в среднем 10% клубней. Из **n = 200** клубней найти вероятность того, что повреждено от 15 до 50 клубней.
|
||||
|
||||
Дано: n = 200, p = 0,10, q = 0,90
|
||||
np = 20, npq = 18, √(npq) ≈ 4,243
|
||||
|
||||
$$x_1 = \frac{15 - 20}{4{,}243} \approx -1{,}18, \quad x_2 = \frac{50 - 20}{4{,}243} \approx 7{,}07$$
|
||||
|
||||
$$P_{200}(15 \leq m \leq 50) \approx \Phi(7{,}07) - \Phi(-1{,}18) \approx 0{,}5 - (-0{,}3810) = 0{,}5 + 0{,}3810 \approx \mathbf{0{,}881}$$
|
||||
Loading…
Reference in New Issue