由手機選號想到的概率問題
Update:悲劇啊,寫了一個多小時的博客沒有了。Safari這個垃圾,我沒按F5,怎麽會給我自動刷新?寫了半天,一刷新,啥都沒了,然後Wordpress緊接著給我來了個auto save draft,博客就變成空白了,引以爲戒,在綫編輯不靠譜啊。
----------------------------
今天去買香港的手機號,發現滿街都是中移動的馬甲運營商Peoples,其他運營商都要辦了身份證之後才可以辦理。不過好在香港這邊擷號轉網比較方便。香港這邊的手機號只有交錢之後開通時才能看到號碼,比較坑爹,不像國內手機靚號都成了產業了。我60港幣第一個號碼是54872341(我死吧,妻兒先死喲)。雖然本人不迷信,但是不能防止跟你聯繫的其他人不迷信,就又花了60塊,又買了一張,還是帶4,但是比前面一張好一些,至少不會引起莫名聯想。遂想到一個問題,8位數字的號碼,買到帶4的號碼的概率是多少。
先寫了個程序,統計經驗概率:
bool hasFour(int n)
{
while (n > ) {
if (n % 10 == 4)
return true;
n /= 10;
}
return false;
}
int main (int argc, const char * argv[])
{
int cnt = ;
::srand(::time());
for (int i = ; i < 100000000; i++) {// 抽樣這麽多次
int n = rand()%100000000; // 隨機生成一個8位整數
if (hasFour(n)) // 判斷有沒有4
cnt++;
}
printf("%d\n", cnt);
return ;
}
運行結果是:57%左右。
還是不滿意,經過糾結的計算,終於找到通解公式:
其中n是手機的號碼位數。這個是用在綫LaTex編輯器生成的,效果不錯。
又改了一下程序:
int Fractal(int n) // 經典遞歸求階乘
{
if (n == 1)
return 1;
else
return Fractal(n – 1) * n;
}
int C(int u, int d) // 算組合
{
return Fractal(u)/(Fractal(d) * Fractal(u – d));
}
int GetDigt(int n) // 算分子
{
int ret = n;
for (int i = 1; i <= n – 1; i++) {
ret += ::pow(9, i) * C(n, i);
}
return ret;
}
int main (int argc, const char * argv[])
{
printf("%f\n", GetDigt(8)/::pow(10, 8));
return ;
}
這次可以得到確切概率了:0.569533
在買一張,帶4的風險還是挺大的。所以作罷了,就用第二個號碼吧,6641打頭。也不錯,號碼裏面還帶敏感詞的。至少不會被墻內的Web Crawler爬到而收到垃圾短信。