zoukankan      html  css  js  c++  java
  • 一个抽奖模型的求解

    一个抽奖模型的求解

    2013-06-19

    问题描述:

             有3组数,分别都是 [0-9] 10个数字,从中随机分别各选择1个数字,不分先后顺序,作为开奖结果。开奖结果设定后,从中随机分别各选择1个数字,不分先后顺序,作为抽奖结果。

             如果3个数字与开奖结果完全匹配,则是一等奖;

             如果2个数字与开奖结果匹配,则是二等奖;

             如果1个数字与开奖结果匹配,则是三等奖;

             如果没有任何数字与开奖结果匹配,则不中奖;

             问:1. 开奖结果总共有多少种?

                       2. 一、二、三等奖的概率各是多少?

    求解过程:

             首选计算开奖结果有多少种。从3组 [0-9] 10个数字中各选1个数字,那么有10^3=1000种情况,但是这是有序的情况。这里不考虑顺序,所以对于567与765这样的情况,是一种结果。所以,为了方便处理,我们对开奖结果设定为ABC,A、B、C 3个数字非降序排列。通过进而计算出现开奖结果有多少种。

             先考虑最直观的一种解法:不考虑非降序的情况,对1000中情况进行非降序处理,然后去重,统计个数即为开奖结果的数量。

             程序如下:

    #include <iostream>
    #include <string>
    #include <set>
    #include <algorithm>
    using namespace std;
    
    void foo(string& s, int n, char c = '0')
    {
        if (s.size() >= n)
        {
            return;
        }
        else
        {
            s = string(n-s.size(), c) + s;
        }
    }
    
    int main()
    {
        char s[3];
        string str;
        set<string> ss;
        for (int i = 0; i != 100; ++i)
        {
            itoa(i, s, 10);
            str = s;
            foo(str, 3);
            sort(str.begin(), str.end());
            ss.insert(str);
        }
        for (int i = 100; i != 1000; ++i)
        {
            itoa(i, s, 10);
            str = s;
            sort(str.begin(), str.end());
            ss.insert(str);
        }
        cout << ss.size() << endl;
        system("PAUSE");
        return 0;
    }

      这样是处理了所有的1000个结果,对其排序并去重。有种更为笨拙的方法是,针对每个结果,去扫描前面是否已经出现过,不过这种原来和上面是一样的,只不过上面用了set时间复杂度为O(NlogN),如果逐个扫描的时间复杂度为O(N^2)。

      这两种方法都不太好,考虑到开奖结果是不区分顺序的,所以对于567、576、657、675、756、765这六种结果都可以看做是一种结果567,我们对结果进行非降序处理。处理后的形式为:ABC,其中A<=B<=C。根据非降序的特性,我们可以得到一种更为快捷的方式来计算开奖结果的数量。程序如下:

    //2.cpp
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int total = 0;
        for (int A = 0; A != 10; ++A)
        {
            for (int B = A; B != 10; ++B)
            {
                for (int C = B; C != 10; ++C)
                {
                    ++total;
                }
            }
        }
        cout << total << endl;
        system("PAUSE");
        return 0;
    }

             这种方法是根据非降序的特性得到的结果,时间复杂度为O(N)。

             综上所述,我们知道开奖结果总结有220种结果。

             那么,这220种结果有几种形式呢,注意,这里的220种是非降序处理后的。有以下四种形式:

             AAA

             AAB

             ABB

             ABC

             其中A<B<C。

             四种形式对应的数目分别为:

             AAA:3个数字一样,所以共计有10种

             AAB:9+8+7+…+1+0 = 45种

             ABB:9+8+7+…+1+0 = 45种

             ABC:220-10-45-45 = 120种

             也可由程序计算而得:

    //3.cpp
    #include <iostream>
    using namespace std;
    
    int main()
    {
        int total = 0;
        int aaa = 0;
        int aab = 0;
        int abb = 0;
        int abc = 0;
        for (int A = 0; A != 10; ++A)
        {
            for (int B = A; B != 10; ++B)
            {
                for (int C = B; C != 10; ++C)
                {
                    if (A == B && B == C)
                    {
                        ++aaa;
                    }
                    else if (A == B && B < C)
                    {
                        ++aab;
                    }
                    else if (A < B && B == C)
                    {
                        ++abb;
                    }
                    else // if (A < B && B < C)
                    {
                        ++abc;
                    }
                    ++total;
                }
            }
        }
        cout << total << endl;
        cout << aaa << endl;
        cout << aab << endl;
        cout << abb << endl;
        cout << abc << endl;
        system("PAUSE");
        return 0;
    }

             综上所述,四种情况的种类数如下:

    AAA

    10

    AAB

    45

    ABB

    45

    ABC

    120

             现在我们计算一等奖的概率,讨论一等奖的概率需要分为以上四种情况。

    1)  AAA

    这种情况只有AAA这种形式,所以中一等奖的概率为 1/1000

    2)  AAB

    这种情况有AAB、ABA、BAA三种形式,中一等奖的概率为3/1000

    3)  ABB

    这种情况有ABB、BAB、BBA三种形式,中一等奖的概率为3/1000

    4)  ABC

    这种情况有ABC、ACB、BAC、BCA、CAB、CBA六种形式,中一等奖的概率为6/1000

             所以,根据全概率公式得到一等奖的概率为:

             P(一等奖) = P(AAA)*P(一等奖|AAA) + P(AAB)*P(一等奖|AAB) + P(ABB)*P(一等奖|ABB) +

     P(ABC)*P(一等奖|ABC)

                                 = 10/1000*1/1000 + 135/1000*3/1000 + 135/1000*3/1000 + 720/1000*6/1000

                                 = 0.00514

             二等奖的概率

    1)  AAA

    中二等奖既是匹配2个数字,所以抽检的结果只能是AAX这种,其中X!=A,所以概率为3*9/1000=27/1000

    2)  AAB

    a)    AAA 这种情况有1种

    b)    AAX 这种情况有3*8种

    c)    ABB 这种情况有3种

    d)    ABX 这种情况有6*8种(X != A, X!= B)

    所以,概率为76/1000

    3)  ABB

    a)  BBB 这种情况有1种

    b)  XBB 这种情况有3*8种

    c)  AAB 这种情况有3种

    d)  ABX 这种情况有6*8种

    所以,概率为76/1000

    4)  ABC

    a)         ABA 这种情况有3种

    b)         ABB 这种情况有3种

    c)         ABX 这种情况有6*7种

    d)         ACA 这种情况有3种

    e)         ACC 这种情况有3种

    f)          ACX 这种情况有6*7种

    g)         BCB 这种情况有3种

    h)         BCC 这种情况有3种

    i)           BCX 这种情况有6*7种

    所以,概率为144/1000

    所以,根据全概率公式得到二等奖的概率为:

    P(二等奖) = P(AAA)*P(二等奖|AAA) + P(AAB)*P(二等奖|AAB) + P(ABB)*P(二等奖|ABB) +

    P(ABC)*P(二等奖|ABC)

                                 = 10/1000*27/1000 + 135/1000*76/1000 + 135/1000*76/1000 +

     720/1000*144/1000

                                 = 0.12447

             三等奖的概率

    1)  AAA

    a)         AXX:3*9=27种情况

    b)         AXY:6*36=216种情况,或3*72=216种情况

                       所以,概率为243/1000

    2)  AAB

    a)         BBB:1种情况

    b)         AXX:3*8=24种情况

    c)         BBX:3*8=24种情况※

    d)         BXX:3*8=24种情况

    e)         AXY:6*28=168种情况,或3*56=168种情况

    f)          BXY:6*28=168种情况,或3*56=168种情况

    所以, 概率为409/1000

    3)  ABB

    a)         AAA:1种情况

    b)         AAX:3*8=24种情况※

    c)         AXX:3*8=24种情况

    d)         BXX:3*8=24种情况

    e)         AXY:6*28=168种情况,或3*56=168种情况

    f)          BXY:6*28=168种情况,或3*56=168种情况

    所以,概率为409/1000

    4)  ABC

    a)         AAA:1种情况

    b)         AAX:3*7=21种情况※

    c)         BBB:1种情况

    d)         BBX:3*7=21种情况※

    e)         CCC:1种情况

    f)          CCX:3*7=21种情况※

    g)         AXX:3*7=21种情况

    h)         BXX:3*7=21种情况

    i)           CXX:3*7=21种情况

    j)           AXY:6*21=126种情况,或3*42=126种情况

    k)         BXY:6*21=126种情况,或3*42=126种情况

    l)           CXY:6*21=126种情况,或3*42=126种情况

    所以,概率为507/1000

    所以,根据全概率公式得到三等奖的概率为:

    P(三等奖) = P(AAA)*P(三等奖|AAA) + P(AAB)*P(三等奖|AAB) + P(ABB)*P(三等奖|ABB) +

    P(ABC)*P(三等奖|ABC)

                           = 10/1000*243/1000 + 135/1000*409/1000 + 135/1000*409/1000 +

    720/1000*507/1000

                                = 0.4779

             不中奖的概率

             P(不中奖)= 1 – P(一等奖)– P(二等奖)– P(三等奖)

                                   = 1 - 0.00514 - 0.12447 - 0.4779

                   = 0.39249

             从四种情况讨论不中奖的概率:

    1)  AAA

    a)         XXX:9种情况

    b)         XXY:3*36=108种情况

    c)         XYY:3*36=108种情况

    或者b、c合并:9*8*3=216种情况

    d)         XYZ:9*8*7=504种情况

    所以,概率为729/1000,另一个角度为:9/10*9/10*9/10=729/1000

    2)  AAB

    8/10*8/10*8/10=512/1000

    a)         XXX:8种情况

    b)         XXY:3*28=84种情况

    c)         XYY:3*28=84种情况

    或者b、c合并:8*7*3=168种情况

    d)         XYZ:8*7*6=336种情况

    所以,概率为512/1000

    3)  ABB

    8/10*8/10*8/10=512/1000

    a)         XXX:8种情况

    b)         XXY:3*28=84种情况

    c)         XYY:3*28=84种情况

    或者b、c合并:8*7*3=168种情况

    d)         XYZ:8*7*6=336种情况

    所以,概率为512/1000

    4)  ABC

    7/10*7/10*7/10=343/1000

    a)         XXX:7种情况

    b)         XXY:3*21=63种情况

    c)         XYY:3*21=63种情况

    或者b、c合并:7*6*3=126种情况

    d)         XYZ:7*6*5=210种情况

    所以,概率为343种情况

    所以,根据全概率公式得到不中奖的概率为:

    P(不中奖) = P(AAA)*P(不中奖|AAA) + P(AAB)*P(不中奖|AAB) + P(ABB)*P(不中奖|ABB) +

    P(ABC)*P(不中奖|ABC)

                           = 10/1000*729/1000 + 135/1000*512/1000 + 135/1000*512/1000 +

    720/1000*343/1000

                                = 0.39249

             综上所述,针对未中奖的概率通过两种方法得到的概率是一致的。这也就证明了我们关于一、二、三等奖的计算是正确的。

    奖项

    概率

    一等奖

    0.00514

    二等奖

    0.12447

    三等奖

    0.4779

    未中奖

    0.39249

    后记:下一步进一步讨论如下方面

    1. 如何判断中奖,即如何判断匹配的数字数及具体匹配了哪些数字

    2. 以上讨论的是3位的抽奖情况,针对N位的情况怎么办,针对N位的情况,如果得到一个开奖结果的汇总(递归实现?)

    (完)

     

    文档信息


    ·版权声明:自由转载-非商用-非衍生-保持署名 | Creative Commons BY-NC-ND 3.0
    ·博客地址:http://www.cnblogs.com/unixfy
    ·博客作者:unixfy
    ·作者邮箱:goonyangxiaofang(AT)163.com
    ·如果你觉得本博文的内容对你有价值,欢迎对博主 
    小额赞助支持


     

     

  • 相关阅读:
    通讯录封装实现
    简单通讯录的实现 main..h .m文件全部
    iOS 开发 OC编程 字典和集合 排序方法
    iOS 开发 OC编程 数组冒泡排序.图书管理
    iOS 开发 OC编程 属性和字符串练习
    iOS 开发 OC编程 属性和字符串
    iOS 开发 OC编程 便利构造器以及初始化方法
    iOS 开发 OC编程 方法的书写
    IOS 开发 OC编程 类和对象
    iOS 开发 c语言阶段考试题
  • 原文地址:https://www.cnblogs.com/unixfy/p/3145209.html
Copyright © 2011-2022 走看看