您的位置:首页 > 其它

第一篇日志

2013-05-30 00:00 162 查看
5.1.2 若只提供RANDOM(0,1),如何实现RANDOM(a,b)。

思路:1.用每一个RANDOM(0,1)表示一位,然后循环[lg(b-a)](上取整)次,得到数x;

2.若x+a <=b,则,(x+a)为所求值;

3.若x+a > b,则,重新计算。

缺点:有可能x的值不在b-a范围内,需要重新计算,无法控制复杂度。若b-a正好是(2的n次方+1),则有50%的概率,不在范围内,需重新计算。如果运气背的话,连续计算100次,也没有结果。

改进措施:1.将上述第一步执行(b-a+1)次,将每次所得的结果相加,再mod(b-a+1);

2.将第一步所得的结果+a,即为所求值。

总结:上述算法的复杂度为O(nlgn),直觉上应该还有更简单的算法,希望能够想到或碰到,更新 。

5.1.3 若提供一个PRE_RANDOM,以一个固定的不可知概率随机的产生 1 和 0,P(1)=p,如何实现RANDOM(0,1).

思路:连续PRE_RANDOM取值2次,输出‘10’的概率和输出‘01’的概率相等,均为p(1-p)。输出‘01’则返回‘0’,输出‘10’则返回‘1’,若输出值为‘00’或‘11’,则重新计算一次。

缺点:若p与0.5差的较远时,可能需要计算较多次才可输出有效序列(01或10),不够优雅。

错误的改进措施:每次PRE_RANDOM输出一位,与上一次输出位组合使用,其他不变。即一直输出,直到在输出的位序列中出现‘01’或‘10’时,输出结束,返回结果。这样将每次PRE_RANDOM2位,降低到随机输出1位,提高效率。

错误原因:如果第一位为1,则本次输出最终的结果一定是‘10’,若第一位是‘0’,则结果一定是‘01’,于是出现‘10’的概率为p,出现‘01’的概率为(1-p),随机失败。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: