1. 給定rand3()能隨機生成整數1到3的函數,寫出能隨機生成整數1到7的函數rand7();
用3*(rand3() - 1) + rand3()生成1-9的數。然后再從1-9中生成1到7.
這種思想是基于,rand()產生[0,N-1],把rand()視為N進制的一位數產生器,那么可以使用rand()*N+rand()來產生2位的N進制數,以此類推,可以產生3位,4位,5位...的N進制數。這種按構造N進制數的方式生成的隨機數,必定能保證隨機。
1 int x = 0 ; 2 do { 3 x = 3 * (rand3() - 1 ) + rand3(); 4 } while (x > 7 ); 5 return x;
如果已經randm()能隨機生成1到m的整數,寫出生成整數1到n的函數randn(),也就是
用m?* (randm() - 1)?+ randm()生成1-m^2,然后再踢掉n+1-m^2這些數。
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.?已知隨機函數rand(),以p的概率產生0,以1-p的概率產生1,現在要求設計一個新的隨機函數newRand(), 使其以1/n的等概率產生1~n之間的任意一個數。
先構造一個函數,使得等概率生成0和1。然后用它,以二進制的方式構造出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位顧客,他們每個人給餐廳的服務生一頂帽子,服務生以隨機的順序歸還給顧客,請問拿到自己帽子的顧客的期望數是多少?
答案:使用指示隨機變量來求解這個問題會簡單些。定義一個隨機變量X等于能夠拿到自己帽子的顧客數目,我們要計算的是E[X]。對于i=1, 2 ... n,定義Xi =I {顧客i拿到自己的帽子},則X=X1+X2+...Xn。由于歸還帽子的順序是隨機的,所以每個顧客拿到自己帽子的概率為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個顧客可以拿到自己的帽子。
4. 如果在高速公路上30分鐘內看到一輛車開過的幾率是0.95,那么在10分鐘內看到一輛車開過的幾率是多少?(假設常概率條件下)
答案:假設10分鐘內看到一輛車開過的概率是x,那么沒有看到車開過的概率就是1-x,30分鐘沒有看到車開過的概率是(1-x)^3,也就是0.05。所以得到方程(1-x)^3 = 0.05 ,解方程得到x大約是0.63。
5. 生日悖論:一個房間至少要有多少人,才能使得有兩個人的生日在同一天?
答案:對房間k個人中的每一對(i, j)定義指示器變量Xij = {i與j生日在同一天} ,則i與j生日相同時,Xij=1,否則Xij=0。兩個人在同一天生日的概率Pr(Xij=1)=1/n。則用X表示同一天生日的兩人對的數目,則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個人,才能期望兩個人的生日在同一天。
轉自:http://blog.csdn.net/hxz_qlh/article/details/1297877
6. 如果只是想要隨機生成一定概率的數。比如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 }
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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