题目一:给定函数f能够均匀随机返回0,1,2,3,4,现要求利用函数f实现一个新函数g,使函数g能够均匀随机返回0,1,2,3,4,5,6
与该题类似还有制作一个骰子使之均匀随机返回整数1~6,然而大多数编程语言提供的生成随机数的函数都是生成0~1之间的浮点数的。如果我们想要随机均匀获取某范围内的数,我们需要对该随机函数生成的结果进行分段,比如0~0.5返回1,0.5~1返回2.但是如果该范围是3个数的话,由于3不能整除pow(10, x),所以最后即使我们分成0.33333333~0.66666666还是不够精确。当然,直接采用线性放大更是不可能的。因此我们考虑使用升维的方法来获取某一范围内的随机数。
首先0~6共7个数,我们现有的函数f每次可以返回5个数中的随机一个,那么5x5=25,即如果我们调用两次函数f,我们一共可能获取到25个坐标。3x7=21,我们给每个数分配3个点,如当我们两次获取到的点为(0,0),(0,1),(0,2),我们就返回0,(0,3),(0,4),(1,0)我们返回1,依次顺序。但是最后应该还有25-21=4个点没有分配,那么当这4个点时我们就接着来。0~6每个数字出现的概率是一个无穷级数求和,收敛于1/7。
题目二:给一个函数f,f以c的概率返回0(0 <= c <= 1),(1 – c)的概率返回1。要求实现函数g,函数g等可能的返回0和1,即返回0和1的概率均为0.5。其中c未知。
思路同上一题。调用两次f得到(a,b),(a,b)可能的情况为(0,0),(0,1),(1,0),(1,1),出现的概率分别是$c^2$,$c(1-c)$,$(1-c)c$,$(1-c)^2$,显然$c(1-c)=(1-c)c$,问题迎刃而解。
def g():
a = f()
b = f()
if a > b:
return 0
elif a < b:
return 1
else:
return g()