一個抽獎模型的求解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位的狀況,若是獲得一個開獎結果的彙總(遞歸實現?)