一個抽獎模型的求解

一個抽獎模型的求解ios

2013-06-19spa

 

問題描述:3d

         有3組數,分別都是 [0-9] 10個數字,從中隨機分別各選擇1個數字,不分前後順序,做爲開獎結果。開獎結果設定後,從中隨機分別各選擇1個數字,不分前後順序,做爲抽獎結果。code

         若是3個數字與開獎結果徹底匹配,則是一等獎;blog

         若是2個數字與開獎結果匹配,則是二等獎;排序

         若是1個數字與開獎結果匹配,則是三等獎;遞歸

         若是沒有任何數字與開獎結果匹配,則不中獎;ci

         問:1. 開獎結果總共有多少種?string

                   2. 1、2、三等獎的機率各是多少?it

 

求解過程:

         首選計算開獎結果有多少種。從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)。

  這兩種方法都不太好,考慮到開獎結果是不區分順序的,因此對於56七、57六、65七、67五、75六、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

 

         綜上所述,針對未中獎的機率經過兩種方法獲得的機率是一致的。這也就證實了咱們關於1、2、三等獎的計算是正確的。

獎項

機率

一等獎

0.00514

二等獎

0.12447

三等獎

0.4779

未中獎

0.39249

 

後記:下一步進一步討論以下方面

1. 如何判斷中獎,即如何判斷匹配的數字數及具體匹配了哪些數字

2. 以上討論的是3位的抽獎狀況,針對N位的狀況怎麼辦,針對N位的狀況,若是獲得一個開獎結果的彙總(遞歸實現?)

相關文章
相關標籤/搜索