5.1-2
random(a,b)将返回一个介于(a,b)之间的整数,题目要求只能调用random(0,1),很明显要转变为二进制计算,且random(0,1)是已经实现了的,令
k
=
⌈
l
g
(
b
−
a
)
⌉
k=\left \lceil lg(b-a) \right \rceil
k=⌈lg(b−a)⌉
k代表了要生成序列的二进制位数,若生成的数不再(a,b)之间就重新生成。
def random(a,b):
l=b-a
k=int(log(l,2)+1)
res=0
for i in range(k):
r=random(0,1)
res=res+r>>i
if res>l:
return randm(a,b)
else:
return a+res
5.1-3
想办法让代表0和代表1的式子概率相等,由题目可知运行两次BIASED-RANDOM会出现四种情况:00|11|01|10,其中概率分别为:
00:
(
1
−
p
)
2
(1-p)^2
(1−p)2
11:
p
2
p^2
p2
01:
p
(
1
−
p
)
p(1-p)
p(1−p)
10:
p
(
1
−
p
)
p(1-p)
p(1−p)
其中01和10的概率相同,那么可以分别令他们为0和1
def uper_random():
x=BIASED_RANDOM()
y=BIASED_RANDOM()
if x==y:
return uper_radom
else:
return x