已知一随机发生器,产生0的概率是p,产生1的概率是1-p,现在要你构造一个发生器,使得它构造0和1的概率均为1/2;构造一个发生器,使得它构造 1、2、3的概率均为1/3;...,构造一个发生器,使得它构造1、2、3、...n的概率均为1/n,要求复杂度最低;
首先是1/2的情况,我们一次性生成两个数值,如果是00或者11丢弃,否则留下,01为1,10为0,他们的概率都是p*(1-p)是相等的,所以等概率了
然后是1/n的情况了,我们以5为例,此时我们取x=2,因为C(2x,x)=C(4,2)=6是比5大的最小的x,此时我们就是一次性生成4位二进制, 把1出现个数不是2的都丢弃,这时候剩下六个:0011,0101,0110,1001,1010,1100,取最小的5个,即丢弃1100,那么我们对 于前5个分别编号1到5,这时候他们的概率都是p*p*(1-p)*(1-p)相等了
关键是找那个最小的x,使得C(2x,x)>=n这样能提升查找效率
之所以取C(2x,x)是为了让同样的序列长度下可用的资源尽量多,因为C(n,i)最大是在i接近n/2的地方取得,此时 我有更大比率的序列用于生成,换句话说被抛掉的更少了,这样做是为了避免大量生成了丢弃序列而使得生成速率减慢,其它的没什么特别的意思。
实际上我之所以将x取定是为了让我取得的序列生成的概率互相相等,比如C(2x,x)的概率就是[p(1-p)]^x,互等的样例空间内保证了对应的每个值取得的样例等概率
浙公网安备 33010602011771号