Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

หาความน่าจะเป็นการไปถึงทุกตำแหน่งหลัง N ครั้งจากจุด N บน Number Line ใน C++


โจทย์: เริ่มที่ตำแหน่ง N บนเส้นจำนวน เดิน N ครั้ง แต่ละครั้งเดินซ้าย (probability L) หรือขวา (1-L) หาความน่าจะเป็นที่จะอยู่ที่แต่ละตำแหน่งหลังเดินครบ N ครั้ง

ตัวอย่าง: N=2, L=0.5 → ตำแหน่งเป็นไปได้: 0, 1, 2, 3, 4 (offset จาก 0 ถึง 2N) ความน่าจะเป็น: [0.25, 0, 0.5, 0, 0.25]

Dynamic Programming Approach

  • A[i][j] = ความน่าจะเป็นอยู่ที่ตำแหน่ง j หลัง i ครั้ง (j = 0..2N)
  • เริ่ม: A[1][N+1] = 1-L (ขวา), A[1][N-1] = L (ซ้าย)
  • Transition:
    • จากซ้าย: A[i][j] += A[i-1][j-1] * (1-L)
    • จากขวา: A[i][j] += A[i-1][j+1] * L
  • คำตอบ: A[N][0..2N]

ตัวอย่างโค้ด C++

#include <bits/stdc++.h>
using namespace std;

void find_prob(int n, double low) {
    double high = 1 - low;
    double A[n + 1][2 * n + 1] = {{0}};
    A[1][n + 1] = high;
    A[1][n - 1] = low;
    for (int i = 2; i <= n; i++) {
        for (int j = 1; j <= 2 * n; j++)
            A[i][j] += A[i - 1][j - 1] * high;
        for (int j = 2 * n - 1; j >= 0; j--)
            A[i][j] += A[i - 1][j + 1] * low;
    }
    for (int i = 0; i < 2*n+1; i++)
        cout << A[n][i] << endl;
}

int main() {
    int n = 2;
    double low = 0.6;
    find_prob(n, low);
}

อินพุต

2, 0.6

เอาต์พุท

0.36
0
0.48
0
0.16

สังเกต

  • ตำแหน่งคู่/คี่ สลับกันเป็น 0 เพราะ parity ของ steps
  • Sum ของ probabilities = 1 เสมอ
  • เป็น Binomial Distribution ที่ปรับเปลี่ยน