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爬到而收到垃圾短信。