1. Tuyển Mod quản lý diễn đàn. Các thành viên xem chi tiết tại đây

Một bài toán xác suất.

Chủ đề trong 'Toán học' bởi Thohry, 30/05/2007.

  1. 0 người đang xem box này (Thành viên: 0, Khách: 0)
  1. Thohry

    Thohry Thành viên rất tích cực

    Tham gia ngày:
    20/12/2006
    Bài viết:
    2.926
    Đã được thích:
    1
    Có thể là em chưa hiểu cách của anh, nhưng như vậy thì anh cũng nên lý giải rõ hơn, ví dụ đoạn T=1/(2^2n+1) thì rõ rồi, nhưng đưa độp công thức của A và B ra mà không giải thích gì thì cũng làm cho nhiều người khó hiểu.
    Em đã viết lại công thức và viết mã để chạy thì cả P1 và P2 đều không có cái nào =1/2 cả. Nếu mã đúng thì công thức của anh sai.
    Dưới đây là công thức viết lại anh xem có đúng ý không:
    [​IMG]
  2. metamodel

    metamodel Thành viên mới

    Tham gia ngày:
    12/12/2004
    Bài viết:
    283
    Đã được thích:
    2
    Ngồi nghĩ thêm về bài toán của em thì anh mới tìm ra cách khác nữa.
    Ở trên anh đã CMR: XS anh1 thắng là 0.5 rồi .
    Bây giờ tính XS hoà.
    Số khả năng hoà = H = Sigma[k=0-->n]C(n,k)*C(n+1,k).
    Dùng phương pháp đa thức, anh tính được ngay :
    H=C(2n+1,n+1).
    Vậy : [XS hoà]=C(2n+1,n+1)/2^(2n+1).
    Và [XS anh2 thắng] = 0.5 - C(2n+1,n+1)/2^(2n+1).
    Còn công thức A, B của anhh ở trên anh không nghĩ là sai. Đợi khi nào rảnh anh viết CT thử rồi xét lại sau nhé.
  3. metamodel

    metamodel Thành viên mới

    Tham gia ngày:
    12/12/2004
    Bài viết:
    283
    Đã được thích:
    2
    Ngồi nghĩ thêm về bài toán của em thì anh mới tìm ra cách khác nữa.
    Ở trên anh đã CMR: XS anh1 thắng là 0.5 rồi .
    Bây giờ tính XS hoà.
    Số khả năng hoà = H = Sigma[k=0-->n]C(n,k)*C(n+1,k).
    Dùng phương pháp đa thức, anh tính được ngay :
    H=C(2n+1,n+1).
    Vậy : [XS hoà]=C(2n+1,n+1)/2^(2n+1).
    Và [XS anh2 thắng] = 0.5 - C(2n+1,n+1)/2^(2n+1).
    Còn công thức A, B của anhh ở trên anh không nghĩ là sai. Đợi khi nào rảnh anh viết CT thử rồi xét lại sau nhé.
  4. werty98

    werty98 Thành viên gắn bó với ttvnol.com

    Tham gia ngày:
    17/06/2003
    Bài viết:
    8.178
    Đã được thích:
    5.572
    Chương trình đây này :
    #include <stdio.h>
    int bitcount(unsigned int num)
    {
    int count = 0,k;
    for (k = 0; k < 8 * sizeof(int); k++)
    {
    if ((num & 1) != 0) count++;
    num>>=1;
    }
    return count;
    }
    int main(void)
    {
    int n,cA,cB;
    int winA = 0, deuce = 0, winB = 0;
    int logmask;
    unsigned int k,maxnum;
    unsigned maskA,maskB;
    double maxnumd;

    printf("n=");
    scanf("%d",&n);
    printf("
    ");
    if ((2*n + 1) > (8 * sizeof(int)))
    {
    printf("Too large number
    ");
    return 1;
    }

    maxnum = ((unsigned int)1 << (2*n + 1)) - 1;
    maskB = ((unsigned int)1 << n) - 1;
    maskA = maxnum - maskB;

    logmask = ((int)1 << 20) - 1;
    for (k = 0; k <= maxnum; k++)
    {
    cA = bitcount(k & maskA);
    cB = bitcount(k & maskB);
    if (cA > cB)
    winA++;
    else if (cA == cB)
    deuce++;
    else
    winB++;

    if (!(k & logmask))
    {
    printf(".");
    fflush(stdout);
    }
    }
    printf("
    ");

    maxnumd = (double)maxnum + 1;
    printf("winA = %d deuce = %d winB = %d
    ",winA,deuce,winB);
    printf("winA = %lf deuce = %lf winB = %lf
    ",(double)winA / maxnumd, (double)deuce / maxnumd, (double)winB / maxnumd);

    return 0;
    }
  5. werty98

    werty98 Thành viên gắn bó với ttvnol.com

    Tham gia ngày:
    17/06/2003
    Bài viết:
    8.178
    Đã được thích:
    5.572
    Chương trình đây này :
    #include <stdio.h>
    int bitcount(unsigned int num)
    {
    int count = 0,k;
    for (k = 0; k < 8 * sizeof(int); k++)
    {
    if ((num & 1) != 0) count++;
    num>>=1;
    }
    return count;
    }
    int main(void)
    {
    int n,cA,cB;
    int winA = 0, deuce = 0, winB = 0;
    int logmask;
    unsigned int k,maxnum;
    unsigned maskA,maskB;
    double maxnumd;

    printf("n=");
    scanf("%d",&n);
    printf("
    ");
    if ((2*n + 1) > (8 * sizeof(int)))
    {
    printf("Too large number
    ");
    return 1;
    }

    maxnum = ((unsigned int)1 << (2*n + 1)) - 1;
    maskB = ((unsigned int)1 << n) - 1;
    maskA = maxnum - maskB;

    logmask = ((int)1 << 20) - 1;
    for (k = 0; k <= maxnum; k++)
    {
    cA = bitcount(k & maskA);
    cB = bitcount(k & maskB);
    if (cA > cB)
    winA++;
    else if (cA == cB)
    deuce++;
    else
    winB++;

    if (!(k & logmask))
    {
    printf(".");
    fflush(stdout);
    }
    }
    printf("
    ");

    maxnumd = (double)maxnum + 1;
    printf("winA = %d deuce = %d winB = %d
    ",winA,deuce,winB);
    printf("winA = %lf deuce = %lf winB = %lf
    ",(double)winA / maxnumd, (double)deuce / maxnumd, (double)winB / maxnumd);

    return 0;
    }
  6. Thohry

    Thohry Thành viên rất tích cực

    Tham gia ngày:
    20/12/2006
    Bài viết:
    2.926
    Đã được thích:
    1
    Mã của bác Wty viết theo kết quả nào mà dài thế. Của em chỉ vài dòng thôi. Excel cũng ok.
    Bác nào viết xong thử chạy với các n sau:
    n=10 ==> P2 = 0,3318
    n=50==> P2 = 0,4212
    n=100 ==> P2 = 0,4439
    n=150 ==> P2 = 0,4541.
  7. Thohry

    Thohry Thành viên rất tích cực

    Tham gia ngày:
    20/12/2006
    Bài viết:
    2.926
    Đã được thích:
    1
    Mã của bác Wty viết theo kết quả nào mà dài thế. Của em chỉ vài dòng thôi. Excel cũng ok.
    Bác nào viết xong thử chạy với các n sau:
    n=10 ==> P2 = 0,3318
    n=50==> P2 = 0,4212
    n=100 ==> P2 = 0,4439
    n=150 ==> P2 = 0,4541.
  8. metamodel

    metamodel Thành viên mới

    Tham gia ngày:
    12/12/2004
    Bài viết:
    283
    Đã được thích:
    2
    Tôi đã viết CT bằng Java theo công thức A , B ở trên và kết quả cho thấy công thức A ,B của tôi đúng.
    B luôn bằng 2^2n và B/T=0.5 với mọi n.
    Như vậy rõ ràng CT của bạn sai . Lần sau kiểm tra cho kỹ nhé, tiên trách kỷ hậu trách nhân, hơn nữa tôi nhắc bạn rất nhiều lần là bạn ktra CT của bạn đi rồi.
    Đây là CT nhé :
    public class probability {
    public static long combi(int n,int k) {
    if ((n < 0) || (k < 0) || (n < k)) return -1;
    long c=1,f=1; int i,h;
    h = ((n - k) < k) ? (n - k) : k;
    for(i=n-h+1;i<=n;i++)c*=i;
    for(i=2;i<=h;i++) f*=i;
    c/=f;
    System.out.println("combi("+n+","+k+")="+c);
    return c;
    }
    public static void main (String[] args){
    int k, n, i; long s = 0,w = 0;
    if (args.length<1){
    System.out.println("Invalid arguments");
    return;
    }
    n=Integer.parseInt(args[0]);

    for(k=1;k<=(n+1);k++){
    w=0;
    for(i=0;i<k;i++) w+=combi(n,i);
    s+=w*combi(n+1,k);
    }
    w = 1<<(2*n+1);

    System.out.println("B = " + s);
    System.out.println("T = " + w);
    System.out.println("B/T = "+(double)s/w);

    }
    }
    Cuối cùng vẫn còn vài câu hỏi mở cho bạn :
    -Giải thích hai công thức A, B (chả phải biện luận gì nhiều để ra hai ct này).
    -Bạn có hiểu đoạn CM B=2^2n bằng pp song ánh không?
    -Coi như bài toán độc lập, CMR: Sigma[k=1-->n+1] { C(n+1,k)*Sigma[i=0-->k-1] {C(n,i)} } = 2^2n với mọi n.
  9. metamodel

    metamodel Thành viên mới

    Tham gia ngày:
    12/12/2004
    Bài viết:
    283
    Đã được thích:
    2
    Tôi đã viết CT bằng Java theo công thức A , B ở trên và kết quả cho thấy công thức A ,B của tôi đúng.
    B luôn bằng 2^2n và B/T=0.5 với mọi n.
    Như vậy rõ ràng CT của bạn sai . Lần sau kiểm tra cho kỹ nhé, tiên trách kỷ hậu trách nhân, hơn nữa tôi nhắc bạn rất nhiều lần là bạn ktra CT của bạn đi rồi.
    Đây là CT nhé :
    public class probability {
    public static long combi(int n,int k) {
    if ((n < 0) || (k < 0) || (n < k)) return -1;
    long c=1,f=1; int i,h;
    h = ((n - k) < k) ? (n - k) : k;
    for(i=n-h+1;i<=n;i++)c*=i;
    for(i=2;i<=h;i++) f*=i;
    c/=f;
    System.out.println("combi("+n+","+k+")="+c);
    return c;
    }
    public static void main (String[] args){
    int k, n, i; long s = 0,w = 0;
    if (args.length<1){
    System.out.println("Invalid arguments");
    return;
    }
    n=Integer.parseInt(args[0]);

    for(k=1;k<=(n+1);k++){
    w=0;
    for(i=0;i<k;i++) w+=combi(n,i);
    s+=w*combi(n+1,k);
    }
    w = 1<<(2*n+1);

    System.out.println("B = " + s);
    System.out.println("T = " + w);
    System.out.println("B/T = "+(double)s/w);

    }
    }
    Cuối cùng vẫn còn vài câu hỏi mở cho bạn :
    -Giải thích hai công thức A, B (chả phải biện luận gì nhiều để ra hai ct này).
    -Bạn có hiểu đoạn CM B=2^2n bằng pp song ánh không?
    -Coi như bài toán độc lập, CMR: Sigma[k=1-->n+1] { C(n+1,k)*Sigma[i=0-->k-1] {C(n,i)} } = 2^2n với mọi n.
  10. Thohry

    Thohry Thành viên rất tích cực

    Tham gia ngày:
    20/12/2006
    Bài viết:
    2.926
    Đã được thích:
    1
    Có gì mà nặng nề thế anh, làm gì mà nhân mới chả kỷ. Vào dđ là trao đổi, học hỏi mà. Trước hết anh thử chạy CT trên với n=100 xem có được không?. Và chạy xem với n=1 thì P2 = bao nhiu?
    Cái đoạn mã viết trên chỉ là quá bình thường nếu đã có lời giải. Mình trao đổi ở đây là để tìm ra thuật toán hay, ngắn gọn dễ hiểu. Chạy CT chủ yếu để kiểm chứn thôi. Em chỉ cần viết trên excel đã ok rồi chứ chưa cần động tới các ngôn ngữ mạnh làm gì.

Chia sẻ trang này