1. 給定rand3()能隨機(jī)生成整數(shù)1到3的函數(shù),寫出能隨機(jī)生成整數(shù)1到7的函數(shù)rand7();
用3*(rand3() - 1) + rand3()生成1-9的數(shù)。然后再從1-9中生成1到7.
這種思想是基于,rand()產(chǎn)生[0,N-1],把rand()視為N進(jìn)制的一位數(shù)產(chǎn)生器,那么可以使用rand()*N+rand()來產(chǎn)生2位的N進(jìn)制數(shù),以此類推,可以產(chǎn)生3位,4位,5位...的N進(jìn)制數(shù)。這種按構(gòu)造N進(jìn)制數(shù)的方式生成的隨機(jī)數(shù),必定能保證隨機(jī)。
1 int x = 0 ; 2 do { 3 x = 3 * (rand3() - 1 ) + rand3(); 4 } while (x > 7 ); 5 return x;
如果已經(jīng)randm()能隨機(jī)生成1到m的整數(shù),寫出生成整數(shù)1到n的函數(shù)randn(),也就是
用m?* (randm() - 1)?+ randm()生成1-m^2,然后再踢掉n+1-m^2這些數(shù)。
1 int x = 0 , max = m * m / n * n; 2 do { 3 x = m * (randm() - 1 ) + randm(); 4 } while (x > max); 5 return 1 + (x % n);
2.?已知隨機(jī)函數(shù)rand(),以p的概率產(chǎn)生0,以1-p的概率產(chǎn)生1,現(xiàn)在要求設(shè)計(jì)一個(gè)新的隨機(jī)函數(shù)newRand(), 使其以1/n的等概率產(chǎn)生1~n之間的任意一個(gè)數(shù)。
先構(gòu)造一個(gè)函數(shù),使得等概率生成0和1。然后用它,以二進(jìn)制的方式構(gòu)造出0~n-1。然后加1就成了1~n。
1 int rand01() { 2 while ( true ) { 3 int a = rand(), b = rand(); 4 if (a == 0 && b == 1 ) return 0 ; 5 if (a == 1 && b == 0 ) return 1 ; 6 } 7 } 8 int randn() { 9 int ans = 0 ; 10 do { 11 for ( int i = 0 ; n; n >>= 1 , i++ ) { 12 if (rand01() == 1 ) { 13 ans |= ( 1 << i); 14 } 15 } 16 } while (ans >= n); 17 return ans + 1 ; 18 }
?3. 帽子問題:有n位顧客,他們每個(gè)人給餐廳的服務(wù)生一頂帽子,服務(wù)生以隨機(jī)的順序歸還給顧客,請(qǐng)問拿到自己帽子的顧客的期望數(shù)是多少?
答案:使用指示隨機(jī)變量來求解這個(gè)問題會(huì)簡單些。定義一個(gè)隨機(jī)變量X等于能夠拿到自己帽子的顧客數(shù)目,我們要計(jì)算的是E[X]。對(duì)于i=1, 2 ... n,定義Xi =I {顧客i拿到自己的帽子},則X=X1+X2+...Xn。由于歸還帽子的順序是隨機(jī)的,所以每個(gè)顧客拿到自己帽子的概率為1/n,即Pr(Xi=1)=1/n,從而E(Xi)=1/n,所以E(X)=E(X1+X2+...Xn)=E(X1)+E(X2)+...E(Xn)=n*1/n = 1。即大約有1個(gè)顧客可以拿到自己的帽子。
4. 如果在高速公路上30分鐘內(nèi)看到一輛車開過的幾率是0.95,那么在10分鐘內(nèi)看到一輛車開過的幾率是多少?(假設(shè)常概率條件下)
答案:假設(shè)10分鐘內(nèi)看到一輛車開過的概率是x,那么沒有看到車開過的概率就是1-x,30分鐘沒有看到車開過的概率是(1-x)^3,也就是0.05。所以得到方程(1-x)^3 = 0.05 ,解方程得到x大約是0.63。
5. 生日悖論:一個(gè)房間至少要有多少人,才能使得有兩個(gè)人的生日在同一天?
答案:對(duì)房間k個(gè)人中的每一對(duì)(i, j)定義指示器變量Xij = {i與j生日在同一天} ,則i與j生日相同時(shí),Xij=1,否則Xij=0。兩個(gè)人在同一天生日的概率Pr(Xij=1)=1/n。則用X表示同一天生日的兩人對(duì)的數(shù)目,則E(X)=E(∑ki=1 ∑kj=i+1 Xij) = C(k,2)*1/n = k(k-1)/2n,令k(k-1)/2n >=1, 可得到k>=28,即至少要有28個(gè)人,才能期望兩個(gè)人的生日在同一天。
轉(zhuǎn)自:http://blog.csdn.net/hxz_qlh/article/details/1297877
6. 如果只是想要隨機(jī)生成一定概率的數(shù)。比如20%生成0,20%生成1,60%生成2.
1 int rand( int num[], float prob[], int n) { 2 srand(time(NULL)); 3 int random = rand() % 100 + 1 ; 4 5 int range = 0 , pre = 0 ; 6 for ( int i = 0 ; i < n; ++ i) { 7 range += static_case< int >(prob[i] * 100 ); 8 if (random > pre && random <= range) { 9 return num[i]; 10 } 11 pre = range; 12 } 13 return - 1 ; // error 14 }
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
