1.请描述RANDOM(a,b)的过程的一种实现,它只是调用RANDOM(0,1). 作为a和b的函数,你的过程期望运行时间是多少?;
解决方法: Random(a,b)的本质是从K个数中随机的等概率的选出一个, 用RANDOM(0,1)随机产生n = b-a+1长度的序列S = {X1,X2,..,Xn};
步骤 1.如果产生的序列都为0或都为1则本次筛选作废; 假如 选择把Xi = 0的选项淘汰掉,要从剩余序列中随机选择一个数,进入步骤2;
步骤 2.如果剩余的数列大于一个数,则重复步骤1; 剩余最后一个数则为要选择的数字;
证明这种方式每个数字的选择是1/n的;
定义 Ai表示选择了第i个数字的事件;
Pr{Ai}, Ai事件发生,必须有两件事情发生, 第一,筛后留下的数字中必须有Ai,用事件Bik来表示; 筛选后的数字个数为 {1,...k} 1=<k<n; 第二. 再次从K个数字中选择
Ai; 用事件Aik来表示;假设从K个数中随机选择Ai的算法实现,并且概率为1/k;
Pr(Ai) = ∑Pr{Bik ∩ Aik },1=< k<n;
P{Bik} = C(n-1,k-1)/(2^n-2); 全为 0,1的两个序列排除;
P{Aik} = 1/k;
Bik和Aik两个事件是独立的,因此:
P{Ai} =∑ Pr{Bi ∩ Aik} = ∑P{Bi}*P{Aik} =∑ C(n-1,k-1)/(2^n-2)*1/k,1=< k<n;
求解后得 Pr{Ai} = 1/n;
K个数中随机选择数的算法定义为Random(K), 上述算法可知对于任意K,则k-1的随机概率是 1/k-1时,从K个数中随机选择一个数的概率为1/k;
当K = 2时,Random(2)(Random(0,1)实现从2个数值随机选择一个)的概率是1/2; 数学归纳法 可知对于n>=2个以上的数,此算法产生随机数的概率
为 2/n;
求期望值: 求平均多少次能把规模减少到一;
(2^n - 2)/2^n 的概率能减少至少一个数据; 减少(1,2,3,..k) 1=<k<n个数据;
要求减少n-1个数据,进行随机选择的次数;
设随机变量X为淘汰数据个数: X范围(1....k) 1=<k<n
X = k;
E(X) = ∑C(n,k)*k/(2^n-2) = C(n,1)*1/(2^n-2) + C(n,2)*2/(2^n-2)+....C(n,n-1)*(n-1)/(2^n-2) = n/2 ;
平均每次应该减少 n/2 个数据; 一直到减少为1为止; 因此 期望运行时间为数 为O(logN);
解法2: 选择2^n-1>=(b-a+1); 取最小的n;
Random(0,1)生成 n次,组合为二位机制数; 如果这二进制属于0-b-a+1;则返回该号码;
否则,重新生成;
生成二进制数∈(a,b) 概率为p, 不属于则 为1-p;
p =(b-a+1)/ 2^n;
定义随机变量X 表示生成的二进制数成功的尝试次数:X 的范围{1,2,..........k}. k>=1;
Pr{X = k} = ((1-p)^(k-1))p;∩
期望运行次数(算法中生成m位序列的调用次数)为: E[X]=sum(k*q^(k-1)p) [k=1......+无穷]=1/p=2^n/(b-a+1)
用T表示调用一次RANDOM(0,1)所需要的时间,每次运行时间为输出m位bit的时间:O(log(b-a) × T)
期望运行时间:O(T × log(b-a) × 2^m/(b-a+1) )=(约等于)O(T × log(b-a)) (因为m=(约等于)log(b-a+1))