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ì)您有幫助就好】元

